按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.params
,req.param()
,req.body
,req.query
仍为空。我做错了什么?这是通过require('url')
或require('qs')
执行此操作的唯一方法吗?如果我只想通过快递来表达它?
答案 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
});
在服务器运行时运行此文件。