【问题标题】:FileUpload Api using multer giving No default engine was specified and no extension was providedFileUpload Api using multer give 没有指定默认引擎,也没有提供扩展名
【发布时间】:2020-10-24 17:29:32
【问题描述】:

我正在尝试创建一个用于用户注册的 api 以及个人资料图片。我正在使用 nodejs 并使用 multer 上传它。当我尝试上传图像文件以及其他属性(例如名字、姓氏、电子邮件等)以及 url 时。我希望图像能够从文件系统浏览并将其存储在根目录的“上传”文件夹中。同样在数据库中,我希望只保存图像的 url 而不是图像文件。我也编写了代码,但是当我使用邮递员对其进行测试时,发送请求时出现错误。我尝试在没有图像的情况下创建其他 api,它工作正常,所以我确信数据库连接至少没有问题。我尝试在不同时间同时使用 from data 和 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.Router.js

const {
  createUserWithUpload,
} = require("./user.controller");
const express = require("express");
const router = express.Router();

router.post("/upload", createUserWithUpload);

module.exports = router;

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)

【问题讨论】:

    标签: node.js multer


    【解决方案1】:

    您在某处出错,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 无法呈现视图。您可以通过两种方式解决此问题

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

    【讨论】:

    • 这对我有用,但现在出现另一个错误,即“意外字段”。我已经在问题中发布了错误图片
    • 我不确定为什么它没有在控制台中记录任何错误。或者我可能没有在某处输入 console.log() 。你能帮我吗。我现在只是在控制台中看到下面。你能帮我吗 [nodemon] 启动 node app.js 服务器并在 9999 上运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2019-02-24
    • 2014-04-18
    • 1970-01-01
    相关资源
    最近更新 更多