Lỗi: Không có công cụ mặc định nào được chỉ định và không có tiện ích mở rộng nào được cung cấp


132

Tôi đang làm việc thông qua việc thiết lập một máy chủ http bằng cách sử dụng node.js và engine. Tuy nhiên, tôi tiếp tục gặp phải các vấn đề mà tôi có ít thông tin về cách giải quyết, tôi sẽ đánh giá cao một số trợ giúp giải quyết vấn đề này.

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)

Dưới đây là những gì tôi đã thiết lập để khởi động động cơ này.

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');
};

Câu trả lời:


120

Các công cụ res.render sẽ gây ra lỗi nếu bạn không sử dụng công cụ xem.

Nếu bạn chỉ muốn phục vụ json, hãy thay thế các res.render('error', { error: err });dòng trong mã của bạn bằng:

res.json({ error: err })

PS: Mọi người thường có tin nhắn trong đối tượng trả về:

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

102

Bạn đang thiếu công cụ xem, ví dụ sử dụng ngọc bích :

thay đổi của bạn

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

với

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

Nếu bạn muốn sử dụng cú pháp thân thiện html, hãy sử dụng thay vì ejs

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

BIÊN TẬP

Như bạn có thể đọc từ 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);
}

Bạn phải cài đặt một default engine

Expresstìm kiếm chế độ xem bố cục mặc định bằng program.templatecách bạn có thể đọc dưới đây:

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;

      }
    });

và như bạn có thể đọc dưới đây:

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

công cụ xem mặc định là jade


2
Xin chào, bạn có thể vui lòng giải thích thêm về cách thức này hoạt động? Tôi bắt đầu đọc trên node.js, nghĩ rằng đó là tất cả những gì tôi cần nhưng khi tôi vẫn không thể hiển thị các trang của mình, tôi đã tra cứu lý do và tìm hiểu thông tin về express. Bây giờ tôi đã theo dõi thông tin trên trang express 4.2 và gặp phải lỗi ở trên mà bạn đã giúp đỡ. Bây giờ tôi đã có ejs và nó dường như không phải là tất cả những gì tôi cần. Bạn có thể vui lòng cho tôi một luồng làm thế nào điều này nên làm việc được không?
Kobojunkie


Tôi đã nghĩ rằng đọc tại bạn phải xác định rõ ràng một công cụ xem ngay cả khi bạn đang lưu ý hiển thị chế độ xem. Đó không phải là trường hợp mặc dù.
stevejpurves

15

Nhận xét các res.renderdòng trong mã của bạn và thêm vào next(err);thay thế. Nếu bạn không sử dụng công cụ xem, res.rendercông cụ sẽ báo lỗi.

Xin lỗi, bạn cũng sẽ phải bình luận về dòng này:

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

Giải pháp của tôi sẽ dẫn đến việc không sử dụng một công cụ xem mặc dù. Bạn không cần một công cụ xem, nhưng nếu đó là mục tiêu, hãy thử điều này:

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

Bạn cũng sẽ cần các res.renderdòng khi sử dụng một công cụ xem. Một cái gì đó như thế này:

// 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

Nếu bạn muốn kết xuất tệp html, hãy sử dụng:

response.sendfile('index.html');

Sau đó, bạn xóa:

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

Đặt bạn *.htmltrong viewsthư mục, hoặc phục vụ cho một publicthư mục như tĩnh dir và đặt index.htmltrong publicthư mục.


4
response.sendfile()được phản đối, sử dụng response.sendFile()thay thế. Lưu ý rằng vốn "F".
Pramesh Bajracharya

6

thiết lập công cụ xem theo cách

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

4

Nếu tất cả những gì cần thiết là gửi mã html nội tuyến trong mã, chúng ta có thể sử dụng bên dưới

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

0

Tôi vừa nhận được thông báo lỗi này và vấn đề là tôi đã không thiết lập phần mềm trung gian của mình đúng cách.

Tôi đang xây dựng một blog trong ngăn xếp MEAN và cần phân tích cú pháp cơ thể cho các tệp .jade mà tôi đang sử dụng ở mặt trước. Đây là đoạn mã từ tệp " /middleware/index.js " của tôi, từ dự án của tôi.

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}));

Ngoài ra, đây là tệp " pack.json " của tôi , bạn có thể đang sử dụng các phiên bản công nghệ khác nhau. Lưu ý: vì tôi không chắc chắn về sự phụ thuộc giữa chúng, tôi bao gồm toàn bộ tệp ở đây:

"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"
  }

Hy vọng điều này sẽ giúp được ai đó! Tất cả là tốt nhất!


0

Các câu trả lời trên là chính xác, nhưng tôi thấy rằng một lỗi đánh máy đơn giản cũng có thể tạo ra lỗi này. Ví dụ: tôi có var router = express () thay vì var router = express.Router () và gặp lỗi này. Vì vậy, nó nên như sau:

// 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

Bạn có thể sử dụng trình xử lý lỗi express để sử dụng các trang html tĩnh để xử lý lỗi và để tránh xác định trình xử lý xem.

Lỗi có thể do 404, có thể là lỗi favicon (rõ ràng nếu bạn đã bao gồm thông báo bảng điều khiển trước đó). 'Trình xử lý xem' của 'html' dường như không hợp lệ trong 4.x express.

Bất kể nguyên nhân là gì, bạn có thể tránh việc xác định trình xử lý chế độ xem (hợp lệ) miễn là bạn sửa đổi các thành phần bổ sung của cấu hình.

Lựa chọn của bạn là khắc phục vấn đề này là:

  • Xác định một trình xử lý xem hợp lệ như trong các câu trả lời khác
  • Sử dụng send () thay vì kết xuất để trả về nội dung trực tiếp

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

Sử dụng kết xuất mà không có filepath sẽ tự động gọi trình xử lý chế độ xem như với hai dòng sau trong cấu hình của bạn:

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

và:

res.render('500);

Đảm bảo bạn cài đặt trình xử lý lỗi express với:

npm install --save express-error-handler

Sau đó nhập nó trong app.js của bạn

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

Sau đó thay đổi xử lý lỗi của bạn để sử dụng:

// 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

Chỉ cần đặt công cụ xem trong mã của bạn.

var app = express(); 
app.set('view engine', 'ejs');

0

Lỗi: Không có công cụ mặc định nào được chỉ định và không có tiện ích mở rộng nào được cung cấp

Tôi đã có cùng một vấn đề (để thực hiện một dự án ngăn xếp trung bình) .. vấn đề là tôi đã không đề cập đến công thức để cài đặt npm tức là; pug hoặc jade, ejs, v.v. để giải quyết goto npm này và nhập express --view = pug Foldername. Điều này sẽ tải các tệp pug cần thiết (index.pug, layout.pug, v.v.) trong thư mục của bạn.


0

nếu bạn gặp lỗi này bằng cách sử dụng trình tạo nhanh, tôi đã giải quyết nó bằng cách sử dụng

express --view=ejs myapp

thay vì

express --view=pug myapp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.