Node.js 使用multer的FileUpload Api未指定默认引擎,也未提供扩展

Node.js 使用multer的FileUpload Api未指定默认引擎,也未提供扩展,node.js,multer,Node.js,Multer,我正在尝试创建一个api,用于用户注册和配置文件pic。我使用nodejs并使用multer上传它。当我试图上传imagefile和其他属性,如名字、姓氏、电子邮件等以及url时。我希望图像能够从文件系统浏览,并将其存储在根目录的“uploads”文件夹中。同样在数据库中,我希望只保存图像的url,而不是图像文件。我也写了代码,但当我使用postman测试它时,我在发送请求时出错。我尝试创建其他没有映像的api,它工作得很好,所以我确信数据库连接至少没有问题。我尝试在不同的时间使用fromdat

我正在尝试创建一个api,用于用户注册和配置文件pic。我使用nodejs并使用multer上传它。当我试图上传imagefile和其他属性,如名字、姓氏、电子邮件等以及url时。我希望图像能够从文件系统浏览,并将其存储在根目录的“uploads”文件夹中。同样在数据库中,我希望只保存图像的url,而不是图像文件。我也写了代码,但当我使用postman测试它时,我在发送请求时出错。我尝试创建其他没有映像的api,它工作得很好,所以我确信数据库连接至少没有问题。我尝试在不同的时间使用fromdata和json发送数据,但对我来说不起作用

app.js

require("dotenv").config();
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const multer = require('multer');

const userRouter = require('./users/user.router');

const app = express();

const storage = multer.diskStorage({
    //cb is callback . will always return error
    destination: function(req,file, cb){
        cb(null, 'uploads/')
    },
    filename: function(req, file, cb){
        //cb(null, Date.now() + file.originalname)
        cb(null, `${file.fieldname}_${Date.now()}${path.extname(file.originalname)}`);
    }
});

const fileFilter = (req, file, cb)=>{
    //reject a file
    if(
        file.mimetype === 'image/jpeg' ||
        file.mimetype === 'image/png'  || 
        file.mimetype === 'application/pdf'
    ){
        cb(null, true);
    }else{
        cb(new Error('Please select png, jpeg or pdf format'), false);
        console.log('Not correct file type');
    }
};

app.use(
    multer({
    storage:storage, 
    limits: {fileSize: 1000000000},
    fileFilter: fileFilter
    }).single('sellerimage')
);

//define the folder name for the image file to be displayed to public
//app.use('/images', express.static('uploads'));
app.use('/images', express.static(path.join(__dirname,'uploads')));

//app.use(bodyParser.urlencoded()); // x-www-form-urlencoded <form>
//app.use(bodyParser.json()); //application/json

//convert json object to javascript object
app.use(express.json()); 

app.use('/api/users', userRouter);

// error handler
app.use(function(err, req, res, next) {
    //Multer error handler
    if(err instanceof multer.MulterError){
      res.json({
          success: 0,
          message: err.message
      })
    }
    //Multer error handler ends
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};
  
    // render the error page
    res.status(err.status || 500);
    res.render('error');
  });

app.listen(9999, () => {
    console.log("server up and running on 9999");
  });
user.controller.js

const {
    createUserWithUpload } = require('./user.service.js');

const { genSaltSync, hashSync } = require('bcrypt');

module.exports = {
    createUserWithUpload: (req, res) => {
        if(!req.file){
            const error = new Error("No image provided");
            error.statusCode = 422;
            throw error;
        }
        
        const body = req.body;
        body.url = req.file.path;
        const salt = genSaltSync(10);
        body.password = hashSync(body.password, salt);
        create(body, (err, results) => {
            if (err) {
                console.log(err);
                return res.status(500).json({
                    success: 0,
                    message: "Database connection error"
                });
            }
            return res.status(200).json({
                success: 1,
                data: results
            });
        })
    },
}
user.service.js

const pool = require("../db");

module.exports = {
  createUserWithUpload: (data, callback) => {
    pool.query(
      `INSERT INTO registration(firstName, lastName, gender, email, password, number, url) VALUES (?,?,?,?,?,?,?)`,
      [
        data.first_name,
        data.last_name,
        data.gender,
        data.email,
        data.password,
        data.number,
        data.url
      ],
      (error, results, fields) => {
        if (error) {
          return callback(error);
        }
        return callback(null, results);
      }
    );
  },
};
控制台错误:

Error: No default engine was specified and no extension was provided.
    at new View (C:\NodeJS JWT\node_modules\express\lib\view.js:61:11)
    at Function.render (C:\NodeJS JWT\node_modules\express\lib\application.js:570:12)
    at ServerResponse.render (C:\NodeJS JWT\node_modules\express\lib\response.js:1012:7)
    at C:\NodeJS JWT\app.js:93:9
    at Layer.handle_error (C:\NodeJS JWT\node_modules\express\lib\router\layer.js:71:5)
    at trim_prefix (C:\NodeJS JWT\node_modules\express\lib\router\index.js:315:13)
    at C:\NodeJS JWT\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\NodeJS JWT\node_modules\express\lib\router\index.js:335:12)
    at next (C:\NodeJS JWT\node_modules\express\lib\router\index.js:275:10)
    at Layer.handle_error (C:\NodeJS JWT\node_modules\express\lib\router\layer.js:67:12)

您在某处出错,express试图返回错误页面

app.use(function(err, req, res, next) {
    //Multer error handler
    if(err instanceof multer.MulterError){
        res.json({
            success: 0,
            message: err.message
        })
    }
    //Multer error handler ends
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error'); // express trying to render view, but no view engine has been set
});
您得到的错误意味着express无法渲染视图,因为未设置默认引擎。你可以用两种方法来解决这个问题

  • 如果您的应用程序仅为API,请将
    res.render()
    替换为
    res.json()
    ,并通过json返回错误消息(如有必要)
  • 使用
    app设置默认视图引擎。Set('view engine','pug')
    ——将其设置为要使用的模板引擎

  • 您在某处出错,express正在尝试返回错误页

    app.use(function(err, req, res, next) {
        //Multer error handler
        if(err instanceof multer.MulterError){
            res.json({
                success: 0,
                message: err.message
            })
        }
        //Multer error handler ends
        // set locals, only providing error in development
        res.locals.message = err.message;
        res.locals.error = req.app.get('env') === 'development' ? err : {};
    
        // render the error page
        res.status(err.status || 500);
        res.render('error'); // express trying to render view, but no view engine has been set
    });
    
    您得到的错误意味着express无法渲染视图,因为未设置默认引擎。你可以用两种方法来解决这个问题

  • 如果您的应用程序仅为API,请将
    res.render()
    替换为
    res.json()
    ,并通过json返回错误消息(如有必要)
  • 使用
    app设置默认视图引擎。Set('view engine','pug')
    ——将其设置为要使用的模板引擎

  • 这对我来说很有效,但现在又出现了另一个错误,即“意外字段”。我已经在问题中发布了错误图像,我不确定为什么它没有在控制台中记录任何错误。或者可能是我没有进入console.log()的某个位置。你能帮帮我吗。我现在正在控制台中查看下面的内容。你能帮我一下吗?请[nodemon]启动
    node app.js
    服务器并在9999上运行,这对我来说很有效,但现在又出现了一个错误,即“意外字段”。我已经在问题中发布了错误图像,我不确定为什么它没有在控制台中记录任何错误。或者可能是我没有进入console.log()的某个位置。你能帮帮我吗。我现在正在控制台中查看下面的内容。你能帮我把[nodemon]启动
    node app.js
    服务器并在9999上运行吗