2013-05-13 11 views
15

Đi qua video peepcode nodejs và tạo lại ứng dụng trên các phiên bản hiện tại/nút hiện tại mà tôi đã gặp phải sự cố nhỏ.Làm thế nào để bạn thiết lập tùy chọn ngọc bích dựa trên một ứng dụng thể hiện? (tùy chọn "basedir" là bắt buộc để sử dụng "extends" với đường dẫn "tuyệt đối")

cấu trúc tập tin

site 
- apps 
- - authentication 
- - - views 
- - - - login.jade 
- - - routes.js 
- node_modules 
- public 
- - images 
- - javascripts 
- - stylesheets 
- routes 
- views 
app.js 

login.jade:

extends /views/layout 
block content 
    form(action='/sessions', method='post') 
    label 
     | Username 
     input(type='text', name='user') 
    label 
     | Password 
     input(type='password', name='password') 
    input(type='submit', name='submit') 

app.js

var express = require('express') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path'); 

var app = express(); 

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.set('view options', { basedir: process.env.__dirname}) 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 

require('./apps/authentication/routes')(app) 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

Khi tôi hướng đến localhost:3000/login tôi nhận được lỗi sau:

Error: /Users/bob/code/site/apps/authentication/views/login.jade:1 
    > 1| extends /views/layout 
    2| block content 
    3| form(action='/sessions', method='post') 
    4| label 

the "basedir" option is required to use "extends" with "absolute" paths 

Tôi có thể cập nhật dòng mở rộng thành: mở rộng ../../../views/layout và làm cho nó hoạt động, nhưng tôi muốn biết cách đặt tùy chọn dựa.

Trả lời

23

Bạn có thể sử dụng này:

app.locals.basedir = '/your/base/directory'; 

Hoặc, sử dụng phương pháp mới hơn Express,

app.locals.basedir = path.join(__dirname, 'views'); 
+0

Nhận lỗi tương tự sau khi thêm và khởi động lại. – sclarson

+1

Lạ lùng, giải quyết được vấn đề cho tôi ([email protected], [email protected]). Một cách khác cần làm là chuyển 'basedir' thành tham số với' render': 'res.render ('templatename', {basedir: '/ your/base/directory', ...})'. Cũng làm việc cho tôi ([gist demo tối thiểu] (https://gist.github.com/robertklep/5570115)). – robertklep

+0

Nevermind hoạt động tốt. Tôi đã thực hiện một giả định câm rằng process.env .__ dirname là thư mục gốc hiện tại trong ứng dụng bắt đầu vì một lý do nào đó. Tôi hiện đang sử dụng app.locals.basedir = process.env.PWD và hoạt động tốt. Cảm ơn bạn! – sclarson

7

Trong nhanh, bạn sẽ nhận thấy rằng có,

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

Bạn chỉ có thể đặt dòng này vào lúc đó,

app.locals.basedir = app.get('views'); 

Điều này làm cho người dựa có sẵn thành jade.js để nó có thể giải quyết đường dẫn tuyệt đối.

+0

Bất kỳ cách nào để làm điều này mà không sử dụng 'người dân địa phương'? –