ข้อผิดพลาด: ไม่ได้ระบุเครื่องมือเริ่มต้นและไม่ได้ระบุส่วนขยาย


132

ฉันกำลังดำเนินการตั้งค่าเซิร์ฟเวอร์ http โดยใช้ node.js และ engine อย่างไรก็ตามฉันยังคงพบปัญหาที่มีข้อมูลเพียงเล็กน้อยเกี่ยวกับวิธีแก้ไขฉันขอขอบคุณสำหรับความช่วยเหลือในการแก้ปัญหานี้

Error: No default engine was specified and no extension was provided. 
at new View (...\node_modules\express\lib\view.js:41:42) 
at Function.app.render (...\node_modules\express\lib\application.js:484:12) 
at ServerResponse.res.render (...\node_modules\express\lib\response.js:783:7) 
at Layer.handle (...\app.js:123:7) 
at trim_prefix (...\node_modules\express\lib\router\index.js:225:17) 
at c (...\node_modules\express\lib\router\index.js:198:9) 
at Function.proto.process_params (...\node_modules\express\lib\router\index.js:253:12) 
at next (...\node_modules\express\lib\router\index.js:189:19) 
at next (...\node_modules\express\lib\router\index.js:202:7) 
at next (...\node_modules\express\lib\router\index.js:166:38)

ด้านล่างนี้คือสิ่งที่ฉันได้ตั้งค่าเพื่อสตาร์ทเครื่องยนต์นี้

var http = require('http');  
var module = require("module")
var logger = require('morgan');
var express = require('express');
var app =  module.exports = express();
var silent = 'test' == process.env.NODE_ENV;
var httpServer = http.createServer(app);  // app middleware

app.enable('strict routing');
// app.all('*', function(req, res, next)/*** CORS support.*/
// {
//   if (!req.get('Origin')) return next();// use "*" here to accept any origin
//   res.set('Access-Control-Allow-Origin', 'http://localhost:3000');
//   res.set('Access-Control-Allow-Methods', 'GET, POST');
//   res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type');
//   res.set('Access-Control-Allow-Max-Age', 3600);
//   if ('OPTIONS' == req.method) return res.send(200);
//   next();
// });
app.set('views', __dirname + '/views'); // general config
app.set('view engine', 'html');
app.get('/404', function(req, res, next){
next();// trigger a 404 since no other middleware will match /404 after this one, and we're not responding here
});
app.get('/403', function(req, res, next){// trigger a 403 error
  var err = new Error('not allowed!');
  err.status = 403;
  next(err);
});
app.get('/500', function(req, res, next){// trigger a generic (500) error
  next(new Error('keyboard cat!'));
});
app.use(express.static(__dirname + '/public')); 
//error handlers
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);  
// middleware with an arity of 4 are considered error handling middleware. When you next(err)
// it will be passed through the defined middleware in order, but ONLY those with an arity of 4, ignoring regular middleware.
function clientErrorHandler(err, req, res, next) {
  if (req.xhr) {// whatever you want here, feel free to populate properties on `err` to treat it differently in here.
  res.send(err.status || 500, { error: err.message });
  } 
  else 
  { next(err);}
};
// create an error with .status. we can then use the property in our custom error handler (Connect repects this prop as well)
function error  (status, msg) {
  var err = new Error(msg);
  err.status = status;
  return err;
};
function logErrors  (err, req, res, next) {
  console.error(err.stack);
  next(err);
};
function errorHandler (err, req, res, next) {
  res.status(500);
  res.render('error', { error: err });
};

// Error handlers
// Since this is the last non-error-handling middleware use()d, we assume 404, as nothing else responded.
// $ curl http://localhost:3000/notfound
// $ curl http://localhost:3000/notfound -H "Accept: application/json"
// $ curl http://localhost:3000/notfound -H "Accept: text/plain"
app.use(function(req, res, next){
  res.status(404); 
  if (req.accepts('html')) {// respond with html page
    res.render('404', { url: req.url });
    return;
  } 
  if (req.accepts('json')) {// respond with json
    res.send({ error: 'Not found' });
    return;
  } 
  res.type('txt').send('Not found');// default to plain-text. send()
});

// error-handling middleware, take the same form as regular middleware, however they require an
// arity of 4, aka the signature (err, req, res, next).when connect has an error, it will invoke ONLY error-handling middleware.

// If we were to next() here any remaining non-error-handling middleware would then be executed, or if we next(err) to
// continue passing the error, only error-handling middleware would remain being executed, however here
// we simply respond with an error page.
app.use(function(err, req, res, next){
  // we may use properties of the error object here and next(err) appropriately, or if we possibly recovered from the error, simply next().
  res.status(err.status || 500);
  res.render('500', { error: err });
});

if (!module.parent) {// assigning to exports will not modify module, must use module.exports
  app.listen(3000);
  silent || console.log('Express started on port 3000');
};

คำตอบ:


120

สิ่งที่ res.render จะทำให้เกิดข้อผิดพลาดหากคุณไม่ได้ใช้เครื่องมือดู

หากคุณต้องการเพียงแค่ให้บริการ json ให้แทนที่res.render('error', { error: err });บรรทัดในโค้ดของคุณด้วย:

res.json({ error: err })

PS: ผู้คนมักจะมีข้อความในวัตถุที่ส่งคืน:

res.status(err.status || 500);
res.json({
  message: err.message,
  error: err
});

102

คุณไม่มีเครื่องมือดูตัวอย่างเช่นใช้หยก :

เปลี่ยนไฟล์

app.set('view engine', 'html');

กับ

app.set('view engine', 'jade');

หากคุณต้องการใช้ไวยากรณ์ที่เป็นมิตรกับ html ให้ใช้แทนejs

app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

แก้ไข

ดังที่คุณสามารถอ่านได้จาก view.js Express View Module

module.exports = View;

/**
 * Initialize a new `View` with the given `name`.
 *
 * Options:
 *
 *   - `defaultEngine` the default template engine name
 *   - `engines` template engine require() cache
 *   - `root` root path for view lookup
 *
 * @param {String} name
 * @param {Object} options
 * @api private
 */

function View(name, options) {
  options = options || {};
  this.name = name;
  this.root = options.root;
  var engines = options.engines;
  this.defaultEngine = options.defaultEngine;
  var ext = this.ext = extname(name);
  if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.');
  if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine);
  this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express);
  this.path = this.lookup(name);
}

คุณต้องติดตั้งไฟล์ default engine

Expressค้นหามุมมองเค้าโครงเริ่มต้นตามprogram.templateที่คุณสามารถอ่านด้านล่าง:

mkdir(path + '/views', function(){
      switch (program.template) {
        case 'ejs':
          write(path + '/views/index.ejs', ejsIndex);
          break;
        case 'jade':
          write(path + '/views/layout.jade', jadeLayout);
          write(path + '/views/index.jade', jadeIndex);
          break;
        case 'jshtml':
          write(path + '/views/layout.jshtml', jshtmlLayout);
          write(path + '/views/index.jshtml', jshtmlIndex);
          break;
        case 'hjs':
          write(path + '/views/index.hjs', hoganIndex);
          break;

      }
    });

และตามที่คุณสามารถอ่านด้านล่าง:

program.template = 'jade';
if (program.ejs) program.template = 'ejs';
if (program.jshtml) program.template = 'jshtml';
if (program.hogan) program.template = 'hjs';

เครื่องมือดูเริ่มต้นคือ jade


2
สวัสดีคุณช่วยอธิบายเพิ่มเติมได้ไหมว่ามันทำงานอย่างไร ฉันเริ่มจากการอ่าน node.js โดยคิดว่ามันคือทั้งหมดที่ฉันต้องการ แต่เมื่อฉันยังไม่สามารถแสดงหน้าเว็บของฉันได้ฉันจึงค้นหาสาเหตุและเข้าสู่ข้อมูลเกี่ยวกับ Express ตอนนี้ฉันติดตามข้อมูลในหน้า express 4.2 และพบข้อผิดพลาดด้านบนที่คุณช่วยไว้ ตอนนี้ฉันได้รับ ejs แล้วและดูเหมือนว่ามันจะไม่ใช่ทั้งหมดที่ฉันต้องการ คุณช่วยอธิบายวิธีการทำงานนี้ให้ฉันหน่อยได้ไหม
Kobojunkie

ฉันแนะนำให้คุณอ่านบทช่วยสอนทีละขั้นตอนutahjs.com/2010/09/25/nodejs-express-and-ejs-templatesหรือrobdodson.me/blog/2012/05/31/how-to-use-ejs -in-express
alessandro

ฉันเคยคิดที่จะอ่านว่าคุณต้องกำหนดเอนจินมุมมองอย่างชัดเจนแม้ว่าคุณจะจดบันทึกการแสดงผลมุมมองก็ตาม นั่นไม่ใช่อย่างนั้น
stevejpurves

15

แสดงความคิดเห็นตามres.renderบรรทัดในรหัสของคุณและเพิ่มเข้ามาnext(err);แทน หากคุณไม่ได้ใช้เอนจินการดูres.renderข้อมูลจะทำให้เกิดข้อผิดพลาด

ขออภัยคุณจะต้องแสดงความคิดเห็นในบรรทัดนี้ด้วย:

app.set('view engine', 'html');

วิธีแก้ปัญหาของฉันจะส่งผลให้ไม่ใช้เอนจินดู คุณไม่จำเป็นต้องมีเครื่องมือดู แต่ถ้านั่นคือเป้าหมายให้ลองทำดังนี้:

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
//swap jade for ejs etc

คุณจะต้องมีres.renderเส้นเมื่อใช้เอ็นจิ้นมุมมองเช่นกัน สิ่งนี้:

// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
    message: err.message,
    error: err
    });
  });
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  next(err);
  res.render('error', {
  message: err.message,
  error: {}
  });
});

12

หากคุณต้องการแสดงไฟล์ html ให้ใช้:

response.sendfile('index.html');

จากนั้นคุณลบ:

app.set('view engine', 'html');

ใส่ของคุณ*.htmlในviewsไดเรกทอรีหรือบริการpublicไดเรกทอรีเป็นแบบคงที่ dir และใส่index.htmlในpublicdir


4
response.sendfile()เลิกใช้แล้วให้ใช้response.sendFile()แทน สังเกตว่าตัวพิมพ์ใหญ่ "F"
Pramesh Bajracharya

6

ตั้งค่าดูเอ็นจิ้นด้วยวิธีต่อไปนี้

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

4

หากสิ่งที่จำเป็นคือการส่งโค้ด html แบบอินไลน์ในโค้ดเราสามารถใช้ด้านล่างนี้

var app = express();
app.get('/test.html', function (req, res) {
   res.header('Content-Type', 'text/html').send("<html>my html code</html>");
});

0

ฉันเพิ่งได้รับข้อความแสดงข้อผิดพลาดนี้และปัญหาคือฉันไม่ได้ตั้งค่ามิดเดิลแวร์อย่างถูกต้อง

ฉันกำลังสร้างบล็อกในMEAN stack และต้องการการแยกวิเคราะห์ร่างกายสำหรับไฟล์. jadeที่ฉันใช้ในส่วนหน้า นี่คือตัวอย่างโค้ดจากไฟล์ " /middleware/index.js " จากโครงการของฉัน

var express = require('express');
var morgan = require('morgan');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

module.exports = function (app) {
app.use(morgan('dev'));

// Good for now
// In the future, use connect-mongo or similar
// for persistant sessions
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(cookieParser());
app.use(session({secret: 'building a blog', saveUninitialized: true, resave: true}));

นอกจากนี้นี่คือไฟล์ " package.json " ของฉันคุณอาจใช้เทคโนโลยีเวอร์ชันต่างๆ หมายเหตุ: เนื่องจากฉันไม่แน่ใจในการพึ่งพาระหว่างกันฉันจึงรวมไฟล์ทั้งหมดไว้ที่นี่:

"dependencies": {
    "body-parser": "1.12.3",
    "consolidate": "0.12.1",
    "cookie-parser": "1.3.4",
    "crypto": "0.0.3",
    "debug": "2.1.1",
    "express": "4.12.2",
    "express-mongoose": "0.1.0",
    "express-session": "1.11.1",
    "jade": "1.9.2",
    "method-override": "2.3.2",
    "mongodb": "2.0.28",
    "mongoose": "4.0.2",
    "morgan": "1.5.1",
    "request": "2.55.0",
    "serve-favicon": "2.2.0",
    "swig": "1.4.2"
  }

หวังว่านี่จะช่วยใครสักคน! ดีที่สุด!


0

คำตอบข้างต้นถูกต้อง แต่ฉันพบว่าการพิมพ์ผิดธรรมดาสามารถสร้างข้อผิดพลาดนี้ได้เช่นกัน ตัวอย่างเช่นฉันมี var router = express () แทน var router = express.Router () และได้รับข้อผิดพลาดนี้ ดังนั้นควรเป็นดังนี้:

// App.js 
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended:false}));
// assuming you put views folder in the same directory as app.js
app.set('views', __dirname + '/views')
app.engine('ejs', ejs.renderFile);
app.set('view engine', 'ejs');
// router - wherever you put it, could be in app.js
var router = express.Router();
router.get('/', function (req,res) {
  res.render('/index.ejs');
})

0

คุณสามารถใช้ express-error-handler เพื่อใช้เพจ html แบบคงที่สำหรับการจัดการข้อผิดพลาดและเพื่อหลีกเลี่ยงการกำหนดตัวจัดการมุมมอง

ข้อผิดพลาดอาจเกิดจาก 404 ซึ่งอาจเป็นไอคอน Fav ที่หายไป (เห็นได้ชัดหากคุณรวมข้อความคอนโซลก่อนหน้านี้) 'view handler' ของ 'html' ดูเหมือนจะไม่ถูกต้องใน 4.x express

โดยไม่คำนึงถึงสาเหตุคุณสามารถหลีกเลี่ยงการกำหนดตัวจัดการมุมมอง (ที่ถูกต้อง) ได้ตราบใดที่คุณแก้ไของค์ประกอบเพิ่มเติมของการกำหนดค่าของคุณ

ตัวเลือกของคุณในการแก้ไขปัญหานี้ ได้แก่ :

  • กำหนดตัวจัดการมุมมองที่ถูกต้องเช่นเดียวกับคำตอบอื่น ๆ
  • ใช้ send () แทนการแสดงผลเพื่อส่งคืนเนื้อหาโดยตรง

http://expressjs.com/en/api.html#res.render

การใช้การแสดงผลโดยไม่มีพา ธ ไฟล์จะเรียกใช้ตัวจัดการมุมมองโดยอัตโนมัติเช่นเดียวกับสองบรรทัดต่อไปนี้จากการกำหนดค่าของคุณ:

res.render('404', { url: req.url });

และ:

res.render('500);

ตรวจสอบให้แน่ใจว่าคุณติดตั้ง express-error-handler ด้วย:

npm install --save express-error-handler

จากนั้นนำเข้าใน app.js ของคุณ

var ErrorHandler = require('express-error-handler');

จากนั้นเปลี่ยนการจัดการข้อผิดพลาดของคุณเพื่อใช้:

// define below all other routes
var errorHandler = ErrorHandler({
  static: {
    '404': 'error.html' // put this file in your Public folder
    '500': 'error.html' // ditto
});

// any unresolved requests will 404
app.use(function(req,res,next) {
  var err = new Error('Not Found');
  err.status(404);
  next(err);
}

app.use(errorHandler);


0

ข้อผิดพลาด: ไม่ได้ระบุเครื่องมือเริ่มต้นและไม่ได้ระบุส่วนขยาย

ฉันพบปัญหาเดียวกัน (สำหรับการทำโครงการสแต็กค่าเฉลี่ย) .. ปัญหาคือฉันไม่ได้กล่าวถึงรูปแบบที่จะติดตั้ง npm ie; ปั๊กหรือหยก ejs เป็นต้นเพื่อแก้ปัญหา goto npm นี้และป้อน express --view = pug foldername สิ่งนี้จะโหลดไฟล์ pug ที่จำเป็น (index.pug, layout.pug เป็นต้น) ในโฟลเดอร์ที่คุณกำหนด


0

หากคุณได้รับข้อผิดพลาดนี้โดยใช้เครื่องกำเนิดไฟฟ้าด่วนฉันได้แก้ไขโดยใช้

express --view=ejs myapp

แทน

express --view=pug myapp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.