Как исправить мой код для отдельного файла маршрута и файлов API в node.js

#node.js #express #mean-stack

#node.js #экспресс #mean-stack

Вопрос:

В настоящее время у меня есть 3 файла для этого пользовательского модуля

  1. routers/user.js (На данный момент все функции маршрутизатора находятся здесь, в этом файле, и я хочу разделить их в userServiceAPI.js )
  2. models/user.js
  3. userserviceAPI.js (Мне нужна помощь здесь)

это мой routers/user.js

 const express = require('express')
const User = require('../models/user')
const userModel=require('../models/user')
const router = new express.Router()
const multer = require('multer')
const userApi = require('../services/userservice.api')
//const sharp = require('sharp')
const auth = require('../db/auth')

//My trial code for separate API file
router.post('/addUser',userApi.addUser)


router.post('/users', async (req, res) => {
    const user = new User(req.body)

    try {
        await user.save()
        const token = await user.generateAuthToken()
        res.status(201).send({ user, token })
    } catch (e) {
        res.status(400).send(e)
    }
})

router.post('/users/login', async (req, res) => {
    try {
        const user = await User.findByCredentials(req.body.email, req.body.password)
        const token = await user.generateAuthToken()
        res.send({ user, token })
    } catch (e) {
        res.status(400).send()
    }
})

router.post('/users/logout', auth, async (req, res) => {
    try {
        req.user.tokens = req.user.tokens.filter((token) => {
            return token.token !== req.token
        })
        await req.user.save()

        res.send()
    } catch (e) {
        res.status(500).send()
    }
})

router.post('/users/logoutAll', auth, async (req, res) => {
    try {
        req.user.tokens = []
        await req.user.save()
        res.send()
    } catch (e) {
        res.status(500).send()
    }
})

router.get('/users/me', auth, async (req, res) => {
    res.send(req.user)
})

router.patch('/users/me', auth, async (req, res) => {
    const updates = Object.keys(req.body)
    const allowedUpdates = ['name', 'email', 'password', 'age']
    const isValidOperation = updates.every((update) => allowedUpdates.includes(update))

    if (!isValidOperation) {
        return res.status(400).send({ error: 'Invalid updates!' })
    }

    try {
        updates.forEach((update) => req.user[update] = req.body[update])
        await req.user.save()
        res.send(req.user)
    } catch (e) {
        res.status(400).send(e)
    }
})

router.delete('/users/me', auth, async (req, res) => {
    try {
        await req.user.remove()
        res.send(req.user)
    } catch (e) {
        res.status(500).send()
    }
})

const upload = multer({
    limits: {
        fileSize: 1000000
    },
    fileFilter(req, file, cb) {
        if (!file.originalname.match(/.(jpg|jpeg|png)$/)) {
            return cb(new Error('Please upload an image'))
        }

        cb(undefined, true)
    }
})

router.post('/users/me/avatar', auth, upload.single('avatar'), async (req, res) => {
    const buffer = await sharp(req.file.buffer).resize({ width: 250, height: 250 }).png().toBuffer()
    req.user.avatar = buffer
    await req.user.save()
    res.send()
}, (error, req, res, next) => {
    res.status(400).send({ error: error.message })
})

router.delete('/users/me/avatar', auth, async (req, res) => {
    req.user.avatar = undefined
    await req.user.save()
    res.send()
})

router.get('/users/:id/avatar', async (req, res) => {
    try {
        const user = await User.findById(req.params.id)

        if (!user || !user.avatar) {
            throw new Error()
        }

        res.set('Content-Type', 'image/png')
        res.send(user.avatar)
    } catch (e) {
        res.status(404).send()
    }
})

module.exports = router 
  

Вот мой userserviceAPI.js

 const express = require('express')
const userModel = require('../models/user')
const router = new express.Router()
const multer = require('multer')
const auth = require('../db/auth')

const addUser = (req, res, next) => {
    const user = new userModel(req.body)
    const token = user.generateAuthToken()
    userModel.create(req.body, (err, result) => {
        if (err) return res.status(400).json({ message: 'Please enter correct information.' }) 
        if (result) {
            return res.status(200).send({ user, token }).json({result : result})
        }
    })
}

module.exports = {
    addUser
}
  

Это выполняется отлично, я могу добавить данные из postman мои данные успешно отображаются в Robo 3T, но в визуальном терминале появляются следующие сообщения об ошибках:

 (node:819) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
Server is up on port 3000
events.js:187
      throw er; // Unhandled 'error' event
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:485:11)
    at ServerResponse.header (/Users/ruksz/Desktop/E-comm/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/Users/ruksz/Desktop/E-comm/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/Users/ruksz/Desktop/E-comm/node_modules/express/lib/response.js:267:15)
    at /Users/ruksz/Desktop/E-comm/services/userservice.api.js:13:58
    at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
    at Function.<anonymous> (/Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4855:21)
    at _done (/Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:3071:12)
    at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:3080:18
    at callbackWrapper (/Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:3036:11)
    at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4832:16
    at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
    at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4855:21
    at model.<anonymous> (/Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:496:7)
    at /Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:315:21
    at next (/Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:209:27)
Emitted 'error' event on Function instance at:
    at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4834:13
    at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
    at /Users/ruksz/Desktop/E-comm/node_modules/mongoose/lib/model.js:4855:21
    [... lines matching original stack trace ...]
    at next (/Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:209:27)
    at /Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:182:9
    at /Users/ruksz/Desktop/E-comm/node_modules/kareem/index.js:507:38
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
[nodemon] app crashed - waiting for file changes before starting...
  

Все, что я пытаюсь сделать, это отделить этот API маршрутизаторов в другом файле. Заранее спасибо.

Ответ №1:

что вы пытаетесь сделать с помощью statement return res.status(200).send({ user, token }).json({result : result})

вы можете либо написать return res.status(200).send({ user, token }) , либо return res.json({result : result})

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

1. Электронная почта, которую я использовал, — это разные данные, которые добавляются, но все еще показывают это в терминале ………( узел: 997) Предупреждение о необработанном отказе: Ошибка MongoError: E11000 коллекция ошибок дубликата ключа: Ecomm-api.users индекс: email_1 дублирующий ключ: { email: «hera@gmail.com » }

Ответ №2:

Итак, здесь у вас есть 2 проблемы:

  1. замените вашу строку userModel.create(req.body, (err, result) => { на return userModel.create(req.body, (err, result) => {

  2. У вас есть уникальный ключ в идентификаторе электронной почты, и вы пытаетесь вставить дубликат электронной почты, поэтому вы получаете email_1 dup key: { email: "hera@gmail.com" } ошибку. Добавьте проверку, чтобы найти дубликат идентификатора электронной почты.