POSTMAN 中的 POST 请求发送的参数始终未定义为 express 中的值

Posted

技术标签:

【中文标题】POSTMAN 中的 POST 请求发送的参数始终未定义为 express 中的值【英文标题】:Parameters sent by a POST request in POSTMAN have always undefined as values in express 【发布时间】:2016-01-22 19:47:37 【问题描述】:

我有一个 node express 应用程序(我正在尝试制作一个 rest api),它有一个视图 index.ejs,其中包含一个用于用户名、名称和消息字段(作为输入)的表单,并且每次提交表单时,请求成功并且一个新用户被添加到数据库中(我正在使用redis,但这对于这个问题并不重要)。 问题是,当我尝试使用相同的参数通过 POSTMAN 发出请求时,它总是失败(我尝试了在 body raw board 中插入 json 对象,失败时我也尝试使用 x-www-form-urlencoded 但是这些值始终在服务器的路由器中为 req.body.username、req.body.name 定义)。

插入的json对象是这样的:


    "username" : "shahid85@codeforgeek.com",
    "message" : "shahid message shahid message shahid message shahid message",
    "name" : "simple"

我试图找到一些解决方案,例如 force the content-type to json,但也没有用。

这是我的 app.js

var express = require('express'),
app = express(),
redis = require('redis'),
config = require('./config'),
client = redis.createClient(config.redisConf),
flow = require('flow-maintained'),
//  https://www.npmjs.com/package/flow-maintained
bodyParser = require('body-parser');

/***************************/

client.auth('redistest1');

client.on("error", function (err) 
console.log("Error " + err);
);

client.on('connect', function() 
console.log('connected to redis!!');

);


/*******************************/
app.set('view engine', 'ejs');
/*app.use(function(req, res, next) 
    // IE9 doesn't set headers for cross-domain ajax requests
    if(typeof(req.headers['content-type']) === 'undefined')
        req.headers['content-type'] = "application/json; charset=UTF-8";
    
    next();
)
.use(bodyParser.urlencoded(extended: false));*/

app.use(bodyParser.urlencoded(extended: false));



app.get('/', function(req, res)
  GetMessages(function(messages)       
    res.render('index', messages: messages);
  );
);



app.get('/messages', function(req, res)
  GetMessages(function(messages)
    console.log(' GetMessages is running !!!!');
    console.log('log-code 0003 :: messages.toString() : ' + messages.toString());
    console.log('log-code 0004 :: messages : ' + messages);
    res.json(messages: messages);     
  );
);

app.get('/messages/:id', function(req, res)
    var msgid = req.params.id;
    console.log('log-code 0000 :::     msgid : '+ msgid);

    FetchMessage(msgid, function(msg)
        console.log('log-code 0001 :::     message:'+ msgid+' : '+ msg);
        res.json(message: msg);
    );



);


app.post('/', function(req, res)

    console.log('log-code 0012 ---:::     id:'+ req.body.id);
    console.log('log-code 0013 ---:::     username: '+ req.body.username);
    console.log('log-code 0014 ---:::     name : '+ req.body.name);
    console.log('log-code 0015 ---:::     message:'+ req.body.message);

  var username = req.body.username;
  var name = req.body.name;

  GetUserID(username, name, function(userid) // GetUserID va chercher si un "user:username" existe déjà
                                              // dans la base, si pas trouvé elle crée un nouvel 
                                              //  key ""user:username"" --> value "userid" (en passant 
                                              //  "user" et "username" à CreateUser() qui elle va incrémenter 
                                              //  "next:user:id" et l'utilise comme userid du nouvel "user:username" créé)
    AddMessage(req.body.message, userid, function(messid)
      console.log('Added message: ' + messid);
      res.redirect('/');
    );
  );
);

app.post('/messages', function(req, res)

    console.log('log-code 0018 ---:::     id:'+ req.body.id);
    console.log('log-code 0016 ---:::     username: '+ req.body.username);
    console.log('log-code 0017 ---:::     name : '+ req.body.name);
    console.log('log-code 0018 ---:::     message:'+ req.body.message);
    console.log('log-code 0018 ---:::     id:'+ req.body.id);

  var username = req.body.username;
  var name = req.body.name;

  res.write('\n Bien le bonjour');
  res.end();

);

function CreateUser(username, name, cb)
  client.incr('next:user:id', function(err, userid)
            /*
                Returned value userid is the Integer reply: the value of key after the increment
                see : http://redis.io/commands/incr
            */
    flow.exec(
      function()
        var user_string = 'user:' + userid;
        client.set('user:' + username, userid, this.MULTI());
        client.hset(user_string, 'name', name, this.MULTI());
        client.hset(user_string, 'username', username, this.MULTI());
      ,function(args)
        cb(userid);
      
    );
  );
;

function GetUserID(username, name, cb)
  client.get('user:' + username, function(err, userid)
    if(userid)
      cb(userid);
    else
      CreateUser(username, name, function(new_user)
        cb(new_user);
      );
    
  );
;

function AddMessage(message, userid, cb)
  client.incr('next:message:id', function(err, id)
    flow.exec(
      function()
        var mess_id = 'message:' + id;
        client.set(mess_id, message, this.MULTI());
        client.set(mess_id + ':user', userid, this.MULTI());
        client.lpush('messages', id, this.MULTI());
      ,function()
        cb(id);
      
    );
  );
;


function FetchMessage(id, cb)



  /********************************************/
   // conversion du code en-dessus au flow maintained
   var msg;
    flow.exec(
      function()
        client.get('message:' + id, this);          
      ,function(err, message) 

        msg = message;

        client.get('message:' + id + ':user', this);        
      ,function(err, userid) 

        client.hget('user:' + userid, 'name', this);        
      ,function(err, name)

        cb(message: msg, name: name);
      
    );

    /*********************************************/     

;

function GetMessages(cb)
  flow.exec(
    function()
      client.lrange('messages', 0, -1, this);
    ,function(err, messages)
      //an async foreach
      var final_messages = [];
      flow.serialForEach(messages, function(el)
        FetchMessage(el, this);
      ,function(mess)
        console.log('log-code 0005 :: mess to be added : ' + mess.toString());
        final_messages.push(mess);
      ,function()
        cb(final_messages);
      );
    
  );
;


app.listen(8003);

【问题讨论】:

【参考方案1】:

这对我有用。

    在 Postman use "x-www-form-urlencoded" 的“x-www-form-urlencoded”中输入数据 将此写入您的 app.js 文件 -> app.use(bodyParser.urlencoded(extended: true)); 使用此格式获取所需值 -> req.body.title

我在找到解决方案之前的错误:

    我在 Postman 上使用了“表单数据”。 (扩展时:真实存在)

【讨论】:

【参考方案2】:

点击窗口右上角蓝色提交按钮左侧的“参数”按钮输入您的键值对。应该可以的。

【讨论】:

虽然实际上如果您将它们放在“参数”下,您必须将参数作为 req.query.username 和 req.query.message 等......而不是 req.body.username .

以上是关于POSTMAN 中的 POST 请求发送的参数始终未定义为 express 中的值的主要内容,如果未能解决你的问题,请参考以下文章

postman怎么发送post请求

postman发送post、get请求的区别与参数填写方式

postman发送post请求

postman之get请求

postman 基本用法

postman发送json数据 ,服务端接收json数据