Route.post () требует функцию обратного вызова, но получил [object String] - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь, чтобы приложение моего словаря использовало и меняло узел MDN / экспресс-руководство.

Учебник MDN работает отлично, но мины не работают.

Вот ошибки:

Error: Route.post() requires a callback function but got a [object String]
    at Route.(anonymous function) [as post] (d:\web-projects\vocastudy\node_modules\express\lib\router\route.js:202:15)
    at Function.proto.(anonymous function) [as post] (d:\web-projects\vocastudy\node_modules\express\lib\router\index.js:510:19)
    at Object.<anonymous> (d:\web-projects\vocastudy\routes\catalog.js:9:8)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (d:\web-projects\vocastudy\app.js:9:21)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)

И app.js:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var catalogRouter = require('./routes/catalog');

var app = express();

// Set up mongoose connection
var mongoose = require('mongoose');
var mongoDB = 'mongodb://127.0.0.1/vocastudy';
mongoose.connect(mongoDB);
mongoose.Promise = global.Promise;
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error'));

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/catalog', catalogRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

И мои маршруты catalog.js:

var express = require('express');
var router = express.Router();
var vocabulary_controller = require('../controllers/vocabularyController');

// GET request for creating a Word. NOTE This must come before routes tha display Word (uses id).
router.get('/create', vocabulary_controller.create_get);

/* POST create page */
router.post('/create', vocabulary_controller.create_post);

/* GET home page. */
router.get('/', vocabulary_controller.list);

/* GET detail page */
router.get('/:id', vocabulary_controller.detail);

module.exports = router;

И контроллеры vocabulary.js:

exports.create_post = [

  // Validate fields
  body('word').isLength({ min: 1 }).trim().withMessage('word must be specified'),
  body('meaning').isLength({ min: 1 }).trim().withMessage('meaning must be specified'),
  body('reference').isLength({ min: 1 }).trim().withMessage('reference must be specified'), 

  // Sanitize (trim and escape) the fields
  sanitizeBody('word').trim().escape(),
  sanitizeBody('meaning').trim().escape(),
  sanitizeBody('reference').trim(),escape(),

  // Process request after validation and sanitization
  (req, res, next) => {

    // Extract the validation errors from a request.
    const errors = validationResult(req);

    // Create vocabulary object with escaped and trimmed data.
    if(!errors.isEmpty()) {
      // There are errors.
      res.render('create', { title: 'Create Word', word: req.body, errors: errors.array() });
      return;
    } else {
      // Data from form is valid.

      // Create a Vocabulary object with escaped and trimmed data.
      var vocabulary = new Vocabulary({
        word: req.body.word,
        meaning: req.body.meaning,
        reference: req.body.reference
      });

      vocabulary.save(function(err) {
        if(err) { return next(err); };
        // Successful - redirect to new word record.
        res.redirect(vocabulary.url);
      });
    };
  }
];

Я думаю, что создание пост-контроллера - это массив, поэтому я получил ошибку, но она отлично работает в учебной версии MDN.Я не могу найти свою проблему.почему я получил ошибку route.post?Обратите внимание, что в руководстве mdn тоже используется массив.

1 Ответ

0 голосов
/ 19 сентября 2018

Похоже, что в Express app.post () принимает параметры, которые могут быть массивами обратных вызовов, но router.post () принимает только функционирует как обратные вызовы.Попробуйте предоставить массив непосредственно в экспресс-приложение вместо маршрутизатора, или, как предложил @TimothyLee, используйте синтаксис , чтобы превратить массив в отдельные параметры для функции router.post().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...