【问题标题】:UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError [ERR_ASSERTION]UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):AssertionError [ERR_ASSERTION]
【发布时间】:2022-04-21 04:04:21
【问题描述】:

我在 Visual Studio Code for nodejs 项目中有以下设置:

模型:genre.js

const Joi = require('joi');
const mongoose = require('mongoose');

const genreSchema = new mongoose.Schema({
  name:{
      type:String,
      required:true,
      minlength:5,
      maxlength:50
  }
});

const Genre = mongoose.model('Genre',genreSchema);

function validateGenre(genre) {
    const schema = {
        name: Joi.string().min(3).required()
    };

    return Joi.validate(genre, schema);
}

exports.genreSchema = genreSchema;
exports.Genre = Genre;
exports.validate = validateGenre;

movie.js:

const Joi = require('joi');
const mongoose = require('mongoose');
const { genreSchema } = require('./genre');

const Movie = mongoose.model('Movie', new mongoose.Schema({
    title: {
        type: String,
        required: true,
        trim: true,
        minlength: 5,
        maxlength: 255
    },
    genre: {
        type: genreSchema,
        required: true
    },
    numberInStock: {
        type: Number,
        required: true,
        min: 0,
        max: 255
    },
    dailyRentalRate: {
        type: Number,
        required: true,
        min: 0,
        max: 255
    }
}));

function validateMovie(movie) {
    const schema = {
        title: Joi.string().min(5).max(50).required,
        genreId: Joi.string().required,
        numberInStock: Joi.number().min(0).required,
        dailyRentalRate: Joi.number().min(0).required
    };

    return Joi.validate(movie,schema);
}

exports.Movie = Movie;
exports.validate = validateMovie;

路线:movies.js

const { Movie, validate } = require('../models/movie');
const { Genre } = require('../models/genre');
const mongoose = require('mongoose');
const express = require('express');
const router = express.Router();


router.get('/', async (req, res) => {
    const movies = await Movie.find().sort('name');
    res.send(movies);
});

router.get('/:id', async (req, res) => {
    const movie = await Movie.findById(req.params.id);
    if (!movie) return res.status(404).send('The movie with the given Id was not found');
    res.send(movie);
});

router.post('/', async (req, res) => {
    const { error } = validate(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    const genre = await Genre.findById(req.body.genreId);
    if (!genre) return res.status(404).send('Invalid genre.');

    let movie = new Movie({
        title: req.body.title,
        genre: {
            _id: genre._id,
            name: genre.name
        },
        numberInStock: req.body.numberInStock,
        dailyRentalRate: req.body.dailyRentalRate
    });

    movie = await movie.save();
    res.send(movie);
});

router.put('/:id', async (req, res) => {
    const { error } = validate(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    const genre = await Genre.findById(req.body.genreId);
    if (!genre) return res.status(404).send('Invalid genre.');

    const movie = await Movie.findByIdAndUpdate(req.params.id, {
        title: req.body.title,
        genre: {
            _id: genre._id,
            name: genre.name
        },
        numberInStock: req.body.numberInStock,
        dailyRentalRate: req.body.dailyRentalRate
    }, { new: true });

    if (!movie) return res.status(404).send('The movie with the given ID was not found.');
    res.send(movie);
});

router.delete('/:id', async (req, res) => {
    const movie = await Movie.findByIdAndRemove(req.params.id);
    if (!movie) return res.status(404).send('The movie with the given ID was not found.');
    res.send(movie);
});

module.exports = router;

关于尝试使用以下设置创建电影:

我收到一个错误:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):AssertionError [ERR_ASSERTION]

谁能帮我解决这个问题

【问题讨论】:

  • 它是必需的(),但我猜不是必需的
  • 我将 required 更正为 required() ,它对我来说很好

标签: node.js mongodb express mongoose-schema joi


【解决方案1】:

首先,Joi.validate(genre, schema) 是一个过时的内置函数,请尝试执行以下操作:

function validateGenre(genre) {
const schema = joi.object({
    name: Joi.string().min(3).required()
});

  return schema.validate(genre);
}

而且在您的 validateMovie 函数中,您需要在所需的 e.g 旁边添加 ()

function validateMovie(movie){
    const shema = joi.object({
    name: joi.string().max(10).min(5).required();
});
  return shema.validate(movie);

}

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多