त्रुटि: कोई डिफ़ॉल्ट इंजन निर्दिष्ट नहीं किया गया था और कोई एक्सटेंशन प्रदान नहीं किया गया था


132

मैं एक http सर्वर की स्थापना के माध्यम से काम कर रहा हूं। नोड और इंजन का उपयोग कर। हालाँकि, मैं उन मुद्दों पर भाग रहा हूं जिनके बारे में मुझे कम जानकारी है कि कैसे हल करें मैं इस कृपया को हल करने में कुछ मदद करूंगा।

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 सामान एक त्रुटि फेंक देगा।

यदि आप res.render('error', { error: err });अपने कोड में लाइनों को बदलना चाहते हैं , तो:

res.json({ error: err })

पुनश्च: लोग आमतौर पर लौटी हुई वस्तु में भी संदेश देते हैं:

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

102

आप दृश्य इंजन को याद कर रहे हैं, उदाहरण के लिए जेड का उपयोग करें :

अपना बदलें

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

साथ में

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

यदि आप ejs के बजाय एक HTML अनुकूल वाक्यविन्यास का उपयोग करना चाहते हैं

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

संपादित करें

जैसा कि आप view.js एक्सप्रेस व्यू मॉड्यूल से पढ़ सकते हैं

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
नमस्ते, क्या आप आगे बता सकते हैं कि यह कैसे काम करता है? मैंने नोड.जेएस पर पढ़ना शुरू कर दिया, यह सोचकर कि मुझे इसकी ज़रूरत थी, लेकिन जब मुझे अभी भी अपने पृष्ठों को प्रदर्शित नहीं किया जा सका, तो मैंने देखा कि क्यों और एक्सप्रेस पर जानकारी के लिए आया था। अब मैंने एक्सप्रेस 4.2 पृष्ठ पर जानकारी का पालन किया, और उस त्रुटि में भाग गया जिसके साथ आपने मदद की थी। अब मुझे ईजेएस मिल गया और यह अभी भी मुझे वह सब नहीं लगता है जो मुझे चाहिए। क्या आप कृपया मुझे एक प्रवाह दे सकते हैं कि यह कैसे काम करना चाहिए?
कोबोजुन्की


मैंने यह पढ़कर सोचा था कि यदि आप रेंडरिंग विचार नोट कर रहे हैं तो भी आपको स्पष्ट रूप से एक दृश्य इंजन को परिभाषित करना होगा। हालांकि ऐसा नहीं है।
स्टीववेपुरव्स

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स्थिर निर्देशिका के रूप में निर्देशिका और डाल index.htmlमें publicdir।


4
response.sendfile()पदावनत किया जाता है, response.sendFile()इसके बजाय उपयोग करें । ध्यान दें कि राजधानी "एफ"।
प्रमेश बजराचार्य

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 स्टैक में एक ब्लॉग बना रहा हूं और .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 रूटर = express (रूटर) () के बजाय var रूटर = एक्सप्रेस () था और यह त्रुटि मिली। तो यह निम्नलिखित होना चाहिए:

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

आप त्रुटि से निपटने के लिए स्थैतिक html पृष्ठों का उपयोग करने और एक दृश्य हैंडलर को परिभाषित करने से बचने के लिए एक्सप्रेस-एरर-हैंडलर का उपयोग कर सकते हैं।

त्रुटि शायद 404 की वजह से थी, शायद एक लापता फ़ेविकॉन (यदि आपने पिछले कंसोल संदेश को शामिल किया था)। 'Html' का 'व्यू हैंडलर' 4.x एक्सप्रेस में मान्य नहीं लगता है।

कारण के बावजूद, जब तक आप अपने कॉन्फ़िगरेशन के अतिरिक्त तत्वों को संशोधित करते हैं, तब तक आप (मान्य) दृश्य हैंडलर को परिभाषित करने से बच सकते हैं।

इस समस्या को ठीक करने के लिए आपके विकल्प हैं:

  • अन्य उत्तरों की तरह एक मान्य दृश्य हैंडलर परिभाषित करें
  • सीधे सामग्री लौटाने के लिए रेंडर के बजाय सेंड () का उपयोग करें

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

फ़ाइलपथ के बिना रेंडर का उपयोग करना आपके कॉन्फ़िगरेशन से निम्नलिखित दो लाइनों के साथ स्वचालित रूप से एक दृश्य हैंडलर को आमंत्रित करता है:

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

तथा:

res.render('500);

सुनिश्चित करें कि आप एक्सप्रेस-एरर-हैंडलर स्थापित करें:

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 यानी स्थापित करने के लिए प्रारूप का उल्लेख नहीं किया है; pug या jade, ejs इत्यादि तो इस गोटो npm को हल करने के लिए और एक्सप्रेस --view = पग फ़ोल्डरनाम दर्ज करें। यह दिए गए फोल्डर में आवश्यक पग फाइल्स (index.pug, layout.pug आदि ..) लोड करेगा।


0

यदि आपको एक्सप्रेस जनरेटर का उपयोग करके यह त्रुटि मिली है, तो मैंने इसका उपयोग करके हल किया है

express --view=ejs myapp

के बजाय

express --view=pug myapp
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.