查询字符串变量仍处于快速空4

问题描述:

写为这里建议在*简单的服务器:查询字符串变量仍处于快速空4

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 protected]&hotelName=Grand Hotel&confirmNumber=654321&startDate=2017-10-11&endDate=2017-10-15)。

但是req.params,req.param()req.bodyreq.query仍然是空的。我做错了什么?是通过require('url')还是require('qs')完成的唯一方法?如果我想通过快递只有它?

+0

哼哼一般,如果你正在寻找的查询参数应该是一个GET方法没有? 'app.get(...)' –

+0

@MarcoTalento,但可能GET也不适用于我 - 所有都是空的。 –

+0

在进行更改时,是否记得重新启动服务器? – Boaz

问题在于使用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); 
}; 

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: '[email protected]', hotelName: 'Grand' } '100000250242810' '[email protected]' 'Grand'

+0

使用高级REST客户端发送请求,甚至通过浏览器。所有变量和查询都未定义给我 - 'console.log(req.query,senderId,email,hotelName)'output:'[Function:getQuery] undefined undefined undefined' –

+0

主要问题为什么它为你工作,为我工作?!与'resitfy'有冲突吗?我还会从'app.js'调用这段代码,如下所示:'var restApi = require(“./ rest_api”);' –

+0

您可以发布代码来设置会话的Cookie位置吗? – pneedle

每当一个请求与查询制成,查询必须 存在的URL服务器识别他们

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

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <title></title> 
    </head> 
    <body> 
    <form action="/as/?sender=321&[email protected]" 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"); 
}); 

饼干节点模块的更多信息,请参阅here

结论

表单上的查询大多是额外的工作,只能使用req.body和cookie,req.session对象轻松完成工作。除非客户端和服务器之间有额外的数据传输,否则人们通常不会使用它。

UPDATE

,如果你想使用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); 
} 

添加此代码,并复制到这个URL参数在node.js中

像这样定义/:paramlocalhost:5000/bookinghandler/hereisaparam/?queriesHere=123

m AKE一定要添加端口

如果它是一个服务器应用程序,创建另一个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 
}); 

运行这个文件服务器在运行时。

+0

我没有从网站或其他任何地方发送查询:只是在浏览器或高级REST客户端的URL。 URL很简单:'localhost:5000/bookinghandler?sender = 100000250242810&email = some @ email.com&hotelName = Grand%20Hotel&confirmNumber = 654321&startDate = 2017-10-11&endDate = 2017-10-15' –

+0

'req.url' is correct:'/ bookinghandler?sender = 100000250242810&email = some @ email.com&hotelName = Grand%20Hotel&confirmNumber = 654321&startDate = 2017-10-11&endDate = 2017-10-15'但是参数仍未定义。 –

+0

这是因为你没有任何参数在这个网址@AlekseyKontsevich – turmuka