Express промежуточное ПО для настройки ответа - PullRequest
0 голосов
/ 02 марта 2020

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

{
   "successful": "true",
   "message": "Successfully created",
   "data": {
         "name": "Joe",
         "year": 1
    }
}

В настоящее время я просто возвращаю json самих данных (имя, год , и т. д. c.)

Я хочу добавить «успешное», «сообщение» и т. д. c.

Вот некоторые фрагменты моего кода ниже:

маршруты / студент. js

var student_controller = require('../controllers/studentController');
router.get('/list', student_controller.student_list);

контролеры / студент. js

var Student = require('../models/student');

exports.student_list = function(req, res, next) {
    Student.find()
        .exec(function(err, list_students) {
            if (err) {return next(err);}
            res.json(list_students);
        });
};

приложение. js

var studentRouter = require('./routes/student');
app.use('/student', studentRouter);

Как мне создать это промежуточное ПО и в каких файлах я должен его вызывать?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Ответ может быть перехвачен путем переопределения функции response.json. Таким образом, добавляя custom function, каждый раз, когда вызывается response.json(), запускается наша функция перехвата.

middleware / response.filter. js:

// Response Interceptor Middleware
export default (request, response, next) => {
    try {
        const oldJSON = response.json;
        response.json = (data) => {
            // For Async call, handle the promise and then set the data to `oldJson`
            if (data && data.then != undefined) {
                // Resetting json to original to avoid cyclic call.
                return data.then((responseData) => {
                    // Custom logic/code. -----> Write your logic to add success wrapper around the response
                    response.json = oldJSON;
                    return oldJSON.call(response, responseData);
                }).catch((error) => {
                    next(error);
                });
            } else {
                // For non-async interceptor functions
                // Resetting json to original to avoid cyclic call.
                // Custom logic/code.
                response.json = oldJSON;
                return oldJSON.call(response, finalResponse);
            }
        }
    } catch (error) {
        next(error);
    }
}

В файле Server.js зарегистрируйте промежуточное ПО:

// Server.js file
import externalResponseFilter from "./middleware/response.filter.js:";

// Create Express server
const app = express();

// Response interceptor - Initialization.
app.use(externalResponseFilter);

А в контроллере, куда вы возвращаете response, вернитесь с функцией response.json() вместо response.send().

Дайте мне знать, если потребуется какое-либо дополнительное объяснение.

0 голосов
/ 02 марта 2020

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

    router.get('/list',(req,res,next)=>{
    Student.find().then(data=>res.json(data)).catch(err=>conole.log(err)) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...