Express - 出错了:未指定默认引擎且未提供扩展名。

8

我无法让我的API与我的Express服务器配合工作,总是出现错误:

错误:没有指定默认引擎并且没有提供扩展名。

我相当确定这是来自Express路由器,但我找不到错误来自哪里...

我是否正确使用了Express路由器?因为我以前从未使用过它。

server.js:

const createError = require('http-errors');
const express = require("express");
const bodyParser = require("body-parser");
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const api = require('./routes/api');
const app = express();
const MongoClient = require('mongodb').MongoClient;

const MONGODB_URI = process.env.MONGODB_URI;
const PORT = process.env.PORT || 5000;

app.use('/', api);

app.use(logger('dev'));

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
    // 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');
});

// Database object
var db;

// Initialize connection once with db
MongoClient.connect(MONGODB_URI, function(err, database) {
    if(err) throw err;

    db = database;

    // Start the application after the database connection is ready
    app.listen(PORT, () => console.log(`Server listening on port ${PORT}`));
});

module.exports = db;
module.exports = app;

routes/api.js:

// const app = require("../server");
var db = require("../server");
const { videos } = require("../helpers/videos");
const { videoLinksValidator } = require("../helpers/video-links-validator");
const { getTitleType } = require("../helpers/title-type-extractor");
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
    console.log("RESPONSE", res) 
});

// Create a GET route
router.get("/express_backend", (req, res) => {
    res.send({ express: "YOUR EXPRESS BACKEND IS CONNECTED TO REACT" });
});

router.post("/video_url", async (req, res)=> {
    const videoURL = req.body.videoURL.videoURL;

    let titleType = await getTitleType(videoURL);

    let videosAndTitle = await videos(videoURL, titleType);

    let videoAndTitleReady = await videoLinksValidator(videosAndTitle);
    console.log(videoAndTitleReady)
    return res.send(videoAndTitleReady);
});

module.exports = router;

2
你想通过 res.render('error'); 实现什么目的?你是想发送整个页面吗(因为这就是 res.render() 尝试做的事情,但只有在 Express 配置了模板引擎时才能实现)。也许你应该使用 res.sendStatus(err.status || 500) 并完全删除 res.render() 行。或者,如果你想发送一个通用的错误页面,那么使用 res.sendFile() 并在文件系统中使用该 HTML 文件的路径。 - jfriend00
3个回答

13

出现此错误是因为您正在使用res.renderres.render将尝试渲染页面,因此您必须像jade等设置视图引擎。 但是在这里,您不需要这样做,所以将res.render更改为res.send,如下所示
尝试这个

app.use(function(err, req, res, next) {
    // 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.send('error');//this or res.status(err.status || 500).send('error')
});

对于你的第二个问题,你需要在server.js文件的顶部像这样引入bodyParser:

app.use(bodyParser.json()); //here
app.use('/', api);

app.use(logger('dev'));

//app.use(bodyParser.json()); your old code

好的,谢谢,那解决了我的问题。但现在出现了一个新错误:“Cannot read property 'videoURL' of undefined at router.post”。这是我在React应用程序中的POST请求(我在package.json中使用“proxy”:“http://localhost:5000/”):axios.post(/video_url, { videoURL }) .then(res => { console.log("APP RESPONSE: ", res.data) this.setState({ videoAndTitle: res.data }) }) - Jerlam
@Jérémy 很高兴听到我能帮上忙,我已经更新了我的解决方案以回答你的第二个问题。 - Rajan Lagah

5

我遇到了同样的错误。我忘记在server.js文件中添加以下语法。

//set default engine, and provide [handlebars as] extension
app.set('view engine', 'handlebars');


0
在你的代码中,如果你的视图引擎不可用,那么你渲染时就会出现错误。
   res.status(err.status || 500);
    res.render('error');

如果您将应用程序用作API网关,则必须发送这些响应。由于res.send当前已弃用,请使用

  res.status(err.status || 500).send('error');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接