Express 4中的查询字符串变量仍为空

时间:2017-08-28 22:20:56

标签: node.js express query-string

stackoverflow上的建议编写简单服务器:

rest_api.js:

const express = require('express');
const bodyParser = require('body-parser')

// Initialize RESTful server
const app = express();

app.set('port', (process.env.PORT || 5000));
app.use(bodyParser.json() );                        // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({extended: true}));   // to support URL-encoded bodies

// Spin up the server
app.listen(app.get('port'), function() {
    console.log('running on port', app.get('port'))
});

app.post('/bookinghandler', function (req, res) {
    let senderId = req.query.sender;
    let email = req.query.email;
    let hotelName = req.query.hotelName;
    let confirmNumber = req.query.confirmNumber;
    let start = req.query.startDate;
    let end = req.query.endDate;
}

app.js:

// This loads the environment variables from the .env file
require('dotenv-extended').load();

const builder = require('botbuilder');
const restify = require('restify');

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});

// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});

// Listen for messages from users 
server.post('/api/messages', connector.listen());

var bot = require("./bot")
bot.InitializeBot(connector);

// Load REST API module
var restApi = require("./rest_api");

并希望通过查询字符串获取参数(URL中的示例请求:bookinghandler?sender=100000250242810&email=some@email.com&hotelName=Grand Hotel&confirmNumber=654321&startDate=2017-10-11&endDate=2017-10-15)。

但是req.paramsreq.param()req.bodyreq.query仍为空。我做错了什么?这是通过require('url')require('qs')执行此操作的唯一方法吗?如果我只想通过快递来表达它?

3 个答案:

答案 0 :(得分:1)

问题在于使用2个REST框架:表达和解决问题。需要整个应用程序作为restify或表达应用程序。在我有一个restify服务器和内部之前,另一个快速服务器被创建(只是采取了不同的例子)。一般需要使用一个或另一个,而不是两者。

修改了app.js:

// This loads the environment variables from the .env file
require('dotenv-extended').load();

const builder = require('botbuilder');
const restify = require('restify');

// Setup Restify Server
var server = restify.createServer();
server.use(require('restify-plugins').queryParser());
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});

// Index route
server.get('/', function (req, res) {
    res.send('My chat bot')
});

// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});

// Listen for messages from users 
server.post('/api/messages', connector.listen());

var bot = require("./bot")
bot.InitializeBot(connector);

// Load REST API module
var restApi = require("./rest_api");

// POST request from webview page
server.post('/bookinghandler', restApi.BookingHandler);

修改后的rest_api.js:

const service = require("./service");

module.exports.BookingHandler = async function (req, res, next) {
    let senderId = req.query.sender;
    let email = req.query.email;
    let hotelName = req.query.hotelName;
    let confirmNumber = req.query.confirmNumber;
    let start = req.query.startDate;
    let end = req.query.endDate;

    res.send(200);  // Success
    return next(false);
};

答案 1 :(得分:0)

app.post('/bookinghandler', function (req, res) {
       let senderId = req.query.sender;
       let email = req.query.email;
       let hotelName = req.query.hotelName;
       console.log(req.query, senderId, email, hotelName)
})

在我的终端

中打印此输出

{ sender: '100000250242810', email: 'some@email.com', hotelName: 'Grand' } '100000250242810' 'some@email.com' 'Grand'

答案 2 :(得分:-1)

  

每当使用查询发出请求时,查询必须存在于   服务器识别他们的网址。

以下是您的示例代码。您需要在html表单中将查询添加到操作中。您还可以使用&分隔它们。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form action="/as/?sender=321&email=myemail@email.com" method="post">
      <input type="text" name="myName" value="">
      <input type="submit" name="" value="ssss">
    </form>
  </body>
</html>

以下是app.js

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

    var senderId = req.query.sender;
    var email = req.query.email;
    console.log('senderId = ' + senderId + ' email = ' + email);
    res.end("got the info");
});

现在,您将问我这个目的,因为我们已经在表单中定义了它们。好吧,真正的网站不这样做。如果您想评估自己的查询,则需要将其 空白 ,并查看用户是否在浏览器上有任何Cookie。

这是html表单

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form action="/as/?sender=&email=" method="post">
      <input type="text" name="myName" value="">
      <input type="submit" name="" value="ssss">
    </form>
  </body>
</html>

这是我们的应用

app.post('/bookinghandler', function (req, res) {
    if(req.session.user.id){  //checking the cookies if the user is logged in/exists
       var senderId = req.query.sender;
       var email = req.query.email;
    }else{
     res.send("you haven't logged in");
     return false;
    }

    console.log('senderId = ' + senderId + ' email = ' + email);
    res.end("got the info");
});

有关 Cookie 的节点模块的详细信息,请参阅here

<强> 结论

表单上的查询主要是额外的工作,只需使用req.body和Cookie,req.session对象即可轻松完成工作。人们通常不会使用它,除非他们有额外的数据在客户端和服务器之间传输。

<强> 更新

参数在node.js

中定义为此/:param

如果你想使用params

app.get('/bookinghandler/:myParam/?queriesHere='){
   console.log(req.params.myParam + "   and the query: " + req.query.queriesHere);

res.send(req.params.myParam + "   and the query: " + req.query.queriesHere);
}

添加此代码,然后复制并转到此网址localhost:5000/bookinghandler/hereisaparam/?queriesHere=123

确保添加端口

如果它是服务器应用程序,则创建另一个node.js文件,然后再运行它们

<强> otherfile.js

var request = require('request');
request('http://localhost:5000/bookinghandler/hereisaparam/?queriesHere=123', function (error, response, body) {
  if(error){
console.log(error):
return false;
}
  console.log('body:', body); // Print the data
});

在服务器运行时运行此文件。