ত্রুটি: কোনও ডিফল্ট ইঞ্জিন নির্দিষ্ট করা হয়নি এবং কোনও এক্সটেনশন সরবরাহ করা হয়নি


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('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

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

সম্পাদনা

যেমন আপনি ভিউ.জেএসএস এক্সপ্রেস ভিউ মডিউলটি থেকে পড়তে পারেন

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

Expressprogram.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
হাই, আপনি কি দয়া করে আরও ব্যাখ্যা করতে পারেন এটি কীভাবে কাজ করে? আমি নোড.জেএসে পড়া শুরু করেছিলাম, ভেবেছিলাম এটি আমার প্রয়োজন ছিল তবে যখন আমি এখনও আমার পৃষ্ঠাগুলি প্রদর্শন করতে পারছি না তখন কেন আমি তাকিয়ে রইলাম এবং এক্সপ্রেসের তথ্যতে এসেছি। এখন আমি এক্সপ্রেস ৪.২ পৃষ্ঠায় তথ্য অনুসরণ করেছি এবং উপরে যে ত্রুটিটি আপনি সহায়তা করেছেন তাতে ছুটে এসেছি। এখন আমি এজেস পেয়েছি এবং এটি এখনও আমার প্রয়োজনীয় সমস্ত বলে মনে হচ্ছে না। আপনি কী দয়া করে এটি কীভাবে কাজ করা উচিত তা আমাকে একটি প্রবাহ দিতে পারেন?
কোবোজুনকি

আমি আপনাকে পদক্ষেপ টিউটোরিয়ালটি এই পদক্ষেপটি পড়তে পরামর্শ দিচ্ছি utahjs.com/2010/09/25/nodejs-express-and-ejs-templates বা এই robdodson.me/blog/2012/05/31/how-to-use-ejs -ইন-এক্সপ্রেস
এলেসান্দ্রো

আমি পড়তে ভেবেছিলাম যে আপনাকে অবশ্যই ভিউ ইঞ্জিনটি স্পষ্টভাবে সংজ্ঞায়িত করতে হবে এমনকি যদি আপনি নোট রেন্ডারিং মতামতও হন। যদিও এটি ক্ষেত্রে নয়।
স্টিভজপুরেভ

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

আপনি যদি এইচটিএমএল ফাইল রেন্ডার করতে চান তবে ব্যবহার করুন:

response.sendfile('index.html');

তারপরে আপনি সরান:

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

আপনার করা *.htmlমধ্যে viewsডিরেক্টরি, অথবা একটি পরিবেশন করা publicস্ট্যাটিক Dir যেমন ডিরেক্টরি ও করা index.htmlমধ্যে publicDir।


4
response.sendfile()অবচয় করা হয়েছে, response.sendFile()পরিবর্তে ব্যবহার করুন। লক্ষ্য করুন যে মূলধন "এফ"।
বজ্রাচার্য

6

নিম্নলিখিত উপায়ে ইঞ্জিন সেট করুন

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

4

যদি প্রয়োজন হয় তবে কোডটিতে এইচটিএমএল কোড ইনলাইন প্রেরণ করা হয়, আমরা নীচে ব্যবহার করতে পারি

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

এছাড়াও, আমার " প্যাকেজ.জসন " ফাইলটি এখানে আপনি বিভিন্ন সংস্করণের প্রযুক্তি ব্যবহার করতে পারেন using দ্রষ্টব্য: কারণ আমি তাদের মধ্যে নির্ভরতা সম্পর্কে নিশ্চিত নই, আমি এখানে পুরো ফাইলটি অন্তর্ভুক্ত করছি:

"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 রাউটার = এক্সপ্রেস (এক্সপ্রেস) এর পরিবর্তে ভের রাউটার = এক্সপ্রেস () ছিল ou রাউটার () এবং এই ত্রুটি পেয়েছি। সুতরাং এটি নিম্নলিখিত হওয়া উচিত:

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

ত্রুটি পরিচালনার জন্য স্থির এইচটিএমএল পৃষ্ঠাগুলি ব্যবহার করতে এবং ভিউ হ্যান্ডলারের সংজ্ঞাটি এড়াতে আপনি এক্সপ্রেস-ত্রুটি-হ্যান্ডলার ব্যবহার করতে পারেন।

সম্ভবত 404 এর ফলে ত্রুটি ঘটেছে, সম্ভবত একটি অনুপস্থিত ফ্যাভিকন (যদি আপনি পূর্ববর্তী কনসোল বার্তাটি অন্তর্ভুক্ত করেন তবে স্পষ্টতই)। 'এইচটিএমএল' এর 'ভিউ হ্যান্ডলার' 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

ত্রুটি: কোনও ডিফল্ট ইঞ্জিন নির্দিষ্ট করা হয়নি এবং কোনও এক্সটেনশন সরবরাহ করা হয়নি

আমি একই সমস্যা পেয়েছি (একটি গড় স্ট্যাক প্রকল্প করার জন্য) .. সমস্যাটি আমি এনপিএম ইনস্টল করার জন্য ফরমেটটির কথা উল্লেখ করি নি; pug বা jade, ejs ইত্যাদি তাই এই গোটো এনপিএম সমাধান করতে এবং এক্সপ্রেস - ভিউ = পগ ফোল্ডারনেমে প্রবেশ করুন। এটি আপনার প্রদত্ত ফোল্ডারে প্রয়োজনীয় পগ ফাইলগুলি (ইনডেক্স.পগ, লেআউট.পগ ইত্যাদি ..) লোড করবে।


0

আপনি যদি এক্সপ্রেস জেনারেটর ব্যবহার করে এই ত্রুটিটি পেয়ে থাকেন তবে আমি এটি ব্যবহার করে সমাধান করেছি

express --view=ejs myapp

পরিবর্তে

express --view=pug myapp
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.