Я разработчик C#, пытающийся изучить node.js / Dialogflow на лету. Я пытаюсь создать веб-перехватчик в node.js в Azure, который я бы использовал в качестве реализации для моего проекта Dialogflow.
Насколько я понимаю, мне нужно преобразовать следующие
export.dialogflowFirebaseFulfillment = functions.https.onRequest (приложение);
к
expressApp.post ('/ dialogflowFulfillment', (запрос, ответ) => { }
'use strict';
var debug = require('debug');
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
app.post('/dialogflowFulfillment', function (req, res) {
res.send('POST request to homepage');
});
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function () {
debug('Express server listening on port ' + server.address().port);
});
Мой вопрос в том, как мне протестировать «expressApp.post ()», чтобы я знал, что он вызывается. Я использовал Visual Studio 2017 и создал пустое экспресс-приложение node.js, а затем добавил функцию публикации. Я запускаю приложение, а затем использую приложение Postman для отправки почтового запроса по URL-адресу (localhost: 3000) / dialogflowFulfillment, но получаю ошибку 404.
Что мне не хватает? Спасибо за помощь!
Виноват. Обновил вопрос кодом.
Вам нужно переместить свою функцию над обработкой ошибок:
app.use('/', routes);
app.use('/users', users);
// Put your function right here
app.post('/dialogflowFulfillment', function (req, res) {
res.send('POST request to homepage');
});
// Catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
Функция перехвата 404
и пересылки на обработку ошибок выполняет следующие действия, как описано здесь:
Calls to
next()
andnext(err)
indicate that the current handler is complete and in what state.next(err)
will skip all remaining handlers in the chain except for those that are set up to handle errors as described above.
Большое спасибо за решение проблемы за меня. Я внес изменения, и это сработало. Я все еще не уверен в том, что промежуточное программное обеспечение обрабатывает next (). Я проверю упомянутые вами ссылки. Спасибо еще раз.
Экспресс отправляет ошибку HTTP 404
из-за последовательности добавления промежуточного программного обеспечения имеет значение.
Поскольку вы добавили ошибку 404
при отправке промежуточного программного обеспечения сразу после промежуточного программного обеспечения app.use('/users', users);
, промежуточное программное обеспечение 404
будет выполнено следующим - оно выдаст сообщение об ошибке (next(err);
) следующему промежуточному программному обеспечению, которое перехватит все ошибки и отправит ответ. Чтобы решить эту проблему, вам необходимо установить промежуточное ПО для обработки ошибок .use
сразу после всех остальных промежуточных программ:
app.post('/dialogflowFulfillment', function (req, res) {
res.send('POST request to homepage');
});
// catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
Спасибо, что ответили на мой вопрос. Мне непонятно, что вы сказали о маршрутизации промежуточного программного обеспечения. Я буду изучать Экспресс. Спасибо еще раз.
вы можете поделиться полным кодом?