Экспресс-приложение с двумя API (маршрутами), которые имеют два ответа 1) ошибка 2) успех

#javascript #mongodb #rest #express #mongoose

#javascript #mongodb #отдых #экспресс #мангуст

Вопрос:

Это вопрос, касающийся REST api с использованием express. Завершите экспресс-приложение, которое запускается на порту 3000 и подключается к назначению базы данных. В базе данных должна быть коллекция пользователей, которая содержит следующие сведения о пользователе.

a) Идентификатор пользователя — «user1», имя пользователя — «Akshay», фамилия — «Kumar», адрес электронной почты — «khiladi@gmail.com «

б) Идентификатор пользователя — «user2», Имя пользователя — «Rajnikanth», фамилия — «», электронная почта — «boss@rajnikanth.com «

ВЫШЕУКАЗАННАЯ ЧАСТЬ БАЗЫ ДАННЫХ НЕ ЯВЛЯЕТСЯ НЕОБХОДИМОЙ(я опубликовал весь вопрос на всякий случай)

Приложение должно иметь следующий api — /users — возвращает JSON всех пользователей в базе данных /users/:userId — возвращает объект одного пользователя на основе переданного идентификатора пользователя

Отредактируйте следующие файлы в данном приложении — response.js app.js

И сделайте это полностью функциональным REST API со следующими двумя типами ответов: a) Ответ на ошибку — {‘isError’: true, ‘status’: 500,’ErrorMessage’: ’Некоторое сообщение об ошибке’, successMessage: null} б) Ответ на успех — {‘isError’: false, ‘status’: 200,’ErrorMessage’: null,successMessage:’Некоторый результат’}

ПРИМЕЧАНИЕ: Вы не обязаны использовать app.listen(). Это будет обработано системой.

*/

Я попробовал это решение :

    app.get('/users', function(req, res, err) {

    UserModel.find(function(err, result){
         if(err) {
            let apiResponse = response.generateResponse(true, 500, "Some 
     error message", null);
            res.send(apiResponse);
        } else {
            let apiResponse = response.generateResponse(false, 200, "Some 
    result", result);
            res.send(apiResponse);
        }

      });
  });

  app.get('/users/:userId', function(req, res, err){

     BlogModel.findOne({ 'blogId': req.params.userId }, (err, result) => {

        if (err) {
            let apiResponse = response.generateResponse(true, 500, "Some error message", null);
            res.send(apiResponse);

        }  else {
            let apiResponse = response.generateResponse(false, 200, "Some result", result);
            res.send(apiResponse);
        }
    });
});
  

Но это выдает некоторое сообщение о логической ошибке.
Я должен отправить код онлайн, где я отвечаю на свое задание, и компилятор их веб-сайта просто сообщает, есть ли ошибка sytnax или логическая ошибка.

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

ВСЕ .ФАЙЛЫ JS:

app.js

 const express = require('express');
const app = express();
const mongoose = require('mongoose');
const UserModel = require('./User.js');

let db = mongoose.connect('mongodb://testuser:password123@ds149252.mlab.com:49252/assignment', { useMongoClient: true });
const responseLib = require('./responseLib');

app.get('/users', function(req, res, err) {

    UserModel.find(function(err, result){
         if(err) {
            let apiResponse = response.generateResponse(true, 500, "Some error message", null);
            res.send(apiResponse);
        } else {
            let apiResponse = response.generateResponse(false, 200, "Some result", result);
            res.send(apiResponse);
        }

    });
});

app.get('/users/:userId', function(req, res, err){

     BlogModel.findOne({ 'blogId': req.params.userId }, (err, result) => {

        if (err) {
            let apiResponse = response.generateResponse(true, 500, "Some error message", null);
            res.send(apiResponse);

        }  else {
            let apiResponse = response.generateResponse(false, 200, "Some result", result);
            res.send(apiResponse);
        }
    });
});



module.exports = app;
  

Users.js

 // importing mongoose module
// importing mongoose module
const mongoose = require('mongoose')
// import schema 
const Schema = mongoose.Schema;

let userSchema = new Schema(
    {
        userId: {
            type: String,
            unique: true
        },
        firstName: {
            type: String,
            default: ''
        },
        lastName: {
            type: String,
            default: ''
        },
        email: {
            type: String,
            default: ''
        }
    }
)

mongoose.model('User', userSchema);

module.exports = mongoose.model('User', userSchema)
  

responseLib.js

 let generateResponse = (isError,status,errorMessage,successMessage) =>{

let response = {

    isError : isError,
    status : status,
    errorMessage : errorMessage,
    successMessage : successMessage
}
return response

};// end generate response. 

module.exports = {generateResponse:generateResponse}
  

Ответ №1:

в вашем /users/:userId коде маршрутов это должно быть UserModel.findOne() . Также нет смысла объявлять err в вашей функции app.get routes, поскольку вы уже объявляете ее в функции обратного вызова позже как (err, result)

   app.get('/users', (req, res) => {

    UserModel.find((err, result) => {
        if (err) {
            res.send(err);
        } else if (result == undefined || result == null || result == '') {
            res.send("No User Data Found");
        } else {
            res.send(result);
        }
    });
 });

 app.get('/users/:userId', (req, res) => {
    UserModel.findOne({ 'userId': req.params.userId }, (err, result) => {
        if (err) {
            res.send(err);
        } else if (result == undefined || result == null || result == '') {
            res.send("No Such User Found");
        } else {
            res.send(result);
        }
    });
 });`
  

Ответ №2:

Немного сложно точно определить проблему, не зная, что такое «логическая ошибка». Но я предполагаю, что вы не устанавливаете статус в HTTP-ответе. В HTTP-ответе у вас есть заголовки и тело, ваш сгенерированный ответ является телом. Но вы не задаете статус в заголовках.

Поэтому вы должны сделать res.status(200) или res.status(500) , чтобы установить статус в заголовке. Вы должны сделать это перед res.send , потому что res.send это действие, которое возвращает ответ. Пока res.status вы готовите свой ответ перед отправкой.

Вы можете проверить документацию здесь.

Комментарии:

1. Итак, я добавляю res.status после res.send ?? о логической ошибке я просто хочу знать, соответствует ли она логике вопроса или нет. (я делаю то, что просят, или нет?). Спасибо

2. Нет, вы должны были сделать раньше. Повторная отправка отправит ваш ответ, поэтому, если вы сделаете это после, это не будет иметь никакого эффекта. По вашему описанию, я думаю, что с заголовком статуса это будет правильно. Похоже, вы находитесь в правильном направлении.

3. Итак, я попытался добавить res.status, но он говорит, что логика неверна, и дал мне некоторый намек. ПОДСКАЗКА: Возьмите данные в качестве параметров и верните объект из библиотечной функции.

Ответ №3:

прямое копирование-вставка для назначения. Это рабочий код.

app.js

 const express = require('express');
const app = express();
const mongoose = require('mongoose');
const UserModel = require('./User.js');

let db = mongoose.connect('mongodb://testuser:password123@ds149252.mlab.com:49252/assignment', { useMongoClient: true });
const response = require('./responseLib');
app.get('/users', (req, res) => {

    UserModel.find((err, result) => {
        if (err) {
            let apiResponse = response.generateResponse(true, 500, "Some error message", null);
            res.send(apiResponse);
        } else if (result ===undefined || result ===null || result ==='') {
            let apiResponse = response.generateResponse(true, 500, "Some error message", null);
            res.send(apiResponse);
        } else {
             let apiResponse = response.generateResponse(false, 200, null, 'Some result');
            res.send(apiResponse);
        }
    });
 });

 app.get('/users/:userId', (req, res) => {
    UserModel.findOne({ 'userId': req.params.userId }, (err, result) => {
        if (err) {
            let apiResponse = response.generateResponse(true, 500, "Some error message", null);
            res.send(apiResponse);
        } else if (result ===undefined || result ===null || result ==='') {
           let apiResponse = response.generateResponse(true, 500, "Some error message", null);
            res.send(apiResponse);
        } else {
             let apiResponse = response.generateResponse(false, 200, null, 'Some result');
            res.send(apiResponse);
        }
    });
 });



module.exports = app;
  

responseLib.js

 let generateResponse = (isError,status,errorMessage,successMessage) =>{
   let response = {

    isError : isError,
    status : status,
    errorMessage : errorMessage,
    successMessage : successMessage
};
return response; 


};// end generate response. 

module.exports = {generateResponse:generateResponse};
  

user.js

 // importing mongoose module
const mongoose = require('mongoose');
// import schema 
const Schema = mongoose.Schema;

let userSchema = new Schema(
    {
        userId: {
            type: String,
            unique: true
        },
        firstName: {
            type: String,
            default: ''
        },
        lastName: {
            type: String,
            default: ''
        },
        email: {
            type: String,
            default: ''
        }
    }
);
mongoose.model('User', userSchema);

module.exports = mongoose.model('User', userSchema);
  

прямое копирование-вставка для назначения. Это рабочий код.