Как правильно использовать функции промежуточного ПО Express в роутере? - PullRequest
0 голосов
/ 24 сентября 2018

В этом примере ниже вы можете видеть, что функции csrfProtection и parseForm передаются как параметры / обратные вызовы в запросах GET и POST ...

var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')

// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })

// create express app
var app = express()

// parse cookies
// we need this because "cookie" is true in csrfProtection
app.use(cookieParser())

app.get('/form', csrfProtection, function(req, res) { // HERE 
  // pass the csrfToken to the view
  res.render('send', { csrfToken: req.csrfToken() })
})

app.post('/process', parseForm, csrfProtection, function(req, res) { // AND HERE
  res.send('data is being processed')
})

Однако, если вы используете маршрутизатор, как я, как можно использовать эти же функции?Мне известно, что «используя» их в app.js, они становятся доступными для объекта req, но в приведенном выше примере они требуются как 2-й, 2-й и 3-й аргументы маршрутов GET и POST, ноreq не будет доступно, пока вы не окажетесь внутри финального обратного вызова?!

Итак, я знаю, что вы не можете выполнить нижеприведенное (просто в качестве примера) ... так как вы должны их использовать?Должен ли я повторно объявлять их в каждом файле маршрутов?

Отдельный файл маршрутов: route / someroute.js ...

router
    .post('/', req.body, req.csrfProtection, (req, res) => {

    })

...

Заранее спасибо:)

Ссылка: https://www.npmjs.com/package/csurf

ОБНОВЛЕНИЕ

Следуя комментариям ниже, я внес следующие измененияв мой файл app.js.

app.js

...

global.bodyParser = require('body-parser').urlencoded({extended: false});
app.use(global.bodyParser);

global.csrfProtection = csrf({ cookie: false });

...

routs / myroute.js

router
    .post('/', global.bodyParser, global.csrfProtection, (req, res) => {})

Однако, когда я перезагружаю сервер, я вижу эту ошибку, которая говорит о том, что глобальная функция не определена ... чего мне здесь не хватает?: - /

Error: Route.post() requires a callback function but got a [object Undefined]

1 Ответ

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

Я думаю, что вы спрашиваете о совместном использовании промежуточного программного обеспечения для всех файлов API / маршрутов

Вы можете сделать это так:

Сначала в вашем основном файле давайте назовем его server.js мы используем вас 're code

var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')

// create express app
var app = express()

// setup route middlewares
app.use(bodyParser.urlencoded({ extended: false }))

// parse cookies
app.use(cookieParser())
//enable your JS API/route script.
const awesomeAPI = require('./awesomeApi.js');
app.use('/awesome', awesomeAPI );
app.listen(3000);

Теперь у вас есть файл, который можно назвать awesomeApi.js

const express = require('express');
const awesomeApi = express.Router();
awesomeApi.route('/')
   .post(req,res => {
  //req.body present here. And body parser middle ware works.
})
module.exports = awesomeApi;

Надеюсь, это поможет.

Некоторые ссылки:

https://expressjs.com/en/guide/using-middleware.html

https://expressjs.com/en/4x/api.html#express

...