“如何修复”;引用错误:未定义消息";在Node.js中

“如何修复”;引用错误:未定义消息";在Node.js中,node.js,Node.js,我是node.js的新手,我需要解析名为“message.txt”的文件中的请求体。当我在控制台上记录message变量时,它可以正常工作。代码很简单,首先,它创建一个服务器,然后通过post方法接收请求,然后将其保存到名为“message.txt”的文件中。我试图更改变量名,但仍然无法解决错误 consthttp=require('http'); 常数fs=要求('fs'); const server=http.createServer((req,res)=>{ const url=req.

我是node.js的新手,我需要解析名为“message.txt”的文件中的请求体。当我在控制台上记录message变量时,它可以正常工作。代码很简单,首先,它创建一个服务器,然后通过post方法接收请求,然后将其保存到名为“message.txt”的文件中。我试图更改变量名,但仍然无法解决错误

consthttp=require('http');
常数fs=要求('fs');
const server=http.createServer((req,res)=>{
const url=req.url;
const method=req.method;
如果(url=='/')){
res.write(“”);
res.write(“输入消息”);
res.write(“提交”);
res.write(“”);
返回res.end();
}
如果(url='/message'&&method=='POST'){
常量体=[];
请求on('数据',(块)=>{
推(块);
控制台日志(正文)
});
请求开启('end',()=>{
const parsedBody=Buffer.concat(body.toString();
//log(parsedBody);
const message=parsedBody.split('=')[1];
//控制台日志(Message)
});
fs.writeFileSync('message.txt',message);
res.statusCode=302;
res.setHeader('位置','/'))
返回res.end();
}
res.setHeader('Content-Type','text/html');
res.write(“”);
res.write('我的第一页!');
res.write('hello from node js');
res.write(“”);
res.end();
});    

服务器。侦听(3000)
如果
块应该是

if(url=='/message'&&method=='POST'){
    const body =[];
    req.on('data',(chunk)=>{
      body.push(chunk);
      console.log(body)
    });
    var message = '';
    req.on('end',()=>{
      const parsedBody = Buffer.concat(body).toString();
     // console.log(parsedBody);
    message = parsedBody.split('=')[1];
    //console.log(messsage)
    });
    fs.writeFileSync('message.txt',message);
    res.statusCode = 302;
    res.setHeader('Location','/')
    return res.end();
  }

基本上,您的
消息
变量的范围仅限于
req.on()
,因此无法在外部访问。

如果

if(url=='/message'&&method=='POST'){
    const body =[];
    req.on('data',(chunk)=>{
      body.push(chunk);
      console.log(body)
    });
    var message = '';
    req.on('end',()=>{
      const parsedBody = Buffer.concat(body).toString();
     // console.log(parsedBody);
    message = parsedBody.split('=')[1];
    //console.log(messsage)
    });
    fs.writeFileSync('message.txt',message);
    res.statusCode = 302;
    res.setHeader('Location','/')
    return res.end();
  }

基本上,您的
消息
变量的作用域仅限于
req.on()
,因此无法在外部访问。

常量变量是块作用域

在您的代码中,有以下内容:

req.on('end',()=>{
    const parsedBody = Buffer.concat(body).toString();
    // console.log(parsedBody);
    const message = parsedBody.split('=')[1];
    //console.log(messsage)
});
fs.writeFileSync('message.txt',message);
在这里,您将传递一个arrow函数作为对
req.on
的第二个参数的回调 此箭头函数有自己的
块范围

通过在该块范围内声明
message
变量,您将无法在其外部访问它

在下一行调用
fs.writeFileSync
时,您正试图这样做,访问
消息
变量,该变量不在该范围内

因此,在范围内移动该行:

req.on('end',() => {
    const parsedBody = Buffer.concat(body).toString();
    const message = parsedBody.split('=')[1];
    fs.writeFileSync('message.txt', message); // here message can be accessed
});


常量变量是块范围的

在您的代码中,有以下内容:

req.on('end',()=>{
    const parsedBody = Buffer.concat(body).toString();
    // console.log(parsedBody);
    const message = parsedBody.split('=')[1];
    //console.log(messsage)
});
fs.writeFileSync('message.txt',message);
在这里,您将传递一个arrow函数作为对
req.on
的第二个参数的回调 此箭头函数有自己的
块范围

通过在该块范围内声明
message
变量,您将无法在其外部访问它

在下一行调用
fs.writeFileSync
时,您正试图这样做,访问
消息
变量,该变量不在该范围内

因此,在范围内移动该行:

req.on('end',() => {
    const parsedBody = Buffer.concat(body).toString();
    const message = parsedBody.split('=')[1];
    fs.writeFileSync('message.txt', message); // here message can be accessed
});


您正在回调函数外使用本地定义的
message
变量。即使全局定义此变量,在将变量传递到
fs.writeFileSync
期间,该变量不具有
NULL
值的可能性也很小


所以只需指定您的
fs.writeFileSync('message.txt',message)在('end',()=>{…}
在定义
消息
变量的行之后。

在回调函数中使用了本地定义的
消息
变量。即使全局定义此变量,在将变量传递到
fs.writeFileSync
期间,该变量不具有
NULL
值的可能性很小


因此,只需在您定义
消息
变量的行后指定您的
fs.writeFileSync('message.txt',message);
使用
req.on('end',()=>{…}
,这些对metnx很好,对我很好