如何获得POST发送的数据?

时间:2019-12-09 18:36:15

标签: javascript node.js api

在nodejs中开发一个API,该API负责将json发送到Web客户端。从javascript,我正在执行以下POST

fetch('http://webapp.panpemws65.us-east-1.elasticbeanstalk.com/DatosPrueba', {
        method: 'POST',
        headers: {
          Accept: 'application/json',
        },
        body: JSON.stringify({
        Codigo: '06056520I000',
        })
      },
      ).then(response => {
        if (response.ok) {
          response.json().then(json => {
            console.log(json);
          });
        }
      });
    }

这是负责接收请求的代码。 这是应该接收代码的API

router.post('/DatosPrueba', (req, res) =>{
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // If needed
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // If needed
    res.setHeader('Access-Control-Allow-Credentials', true); // If needed

    //Recibiendo codigo por parametro
    const Codigo = req.body.Codigo;
    mysqlConnection.query("SELECT * FROM [dbo].[WMS_Movimientos] where Codigo = '" + Codigo + "'", (err,rows) =>{
        if(!err) {
            res.json(rows);
            console.log(rows)
        }else{
            console.log(err);
        }
    });

})

当尝试检索从第一个代码发送的值时 const Codigo = req.body.Codigo; 该数据正在未定义

2 个答案:

答案 0 :(得分:1)

一切正常,但是您错过了标题'content-type'

 fetch('https://webapp.panpemws65.us-east-1.elasticbeanstalk.com/DatosPrueba', 
       {
            method: 'POST',
           headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
         },
            body: JSON.stringify({
            Codigo: '06056520I000',
            })
          }
          ).then(response => {
            if (response.ok) {
              response.json().then(json => {
                console.log(json);
              });
            }
          }).catch(err=>{
          // handle error here
         })

还要确保您正在使用json主体解析器。

并且在发生错误的情况下也在后端发送错误响应,否则一段时间后请求运行超时而没有响应。

router.post('/DatosPrueba', (req, res) =>{
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // If needed
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // If needed
    res.setHeader('Access-Control-Allow-Credentials', true); // If needed

    //Recibiendo codigo por parametro
    const Codigo = req.body.Codigo;
    mysqlConnection.query("SELECT * FROM [dbo].[WMS_Movimientos] where Codigo = '" + Codigo + "'", (err,rows) =>{
        if(!err) {
            res.json(rows);
            console.log(rows)
        }else{
            console.log(err);
            // send error response else client run timeout
            res.status(500).json({"message":"error message"})
        }
    });

})

答案 1 :(得分:0)

如果您没有其他说明,我将更新我的答案,但是此刻您发布的内容给我的印象是您使用的是原始的nodejs(即,没有框架或中间件软件包可以缓解这种情况)。

节点request对象是ReadableStream,您需要通过Stream接口访问它。来自节点文档的示例:

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

如果您不想自己处理这些细粒度的细节,可以使用许多软件包为您提供更友好的界面。