1.4 后端express - OhNaNaSun/angularBlog GitHub Wiki

express

一、 express

参考: express api

response

res.sendfile(path, [options], [fn]])

path所传输附件的路径。 它会根据文件的扩展名自动设置响应头里的Content-Type字段。 回调函数fn(err)在传输完成或者发生错误时会被调用执行。

Options: maxAge 毫秒,默认为0 root 文件相对的路径 这个方法可以非常良好的支持有缩略图的文件服务。

res.render(view, [locals], callback) 渲染view, 同时向callback 传入渲染后的字符串。 callback如果不传的话,直接会把渲染后的字符串输出至请求方, 一般如果不需要再对渲染后的模板作操作,就不需要传callback。 当有错误发生时next(err)会被执行. 如果提供了callback参数,可能发生的错误和渲染的字符串都会被当作参数传入, 并且没有默认响应。

res.send([body|status], [body]) 发送一个响应。

res.send(new Buffer('whoop'));
res.send({ some: 'json' });
res.send('some html');
res.send(404, 'Sorry, we cannot find that!');
res.send(500, { error: 'something blew up' });
res.send(200);

这个方法在输出non-streaming响应的时候自动完成了大量有用的任务 比如如果在它前面没有定义Content-Length, 它会自动设置; 比如加一些自动的 HEAD; 比如对HTTP缓存的支持 . res.json([status|body], [body]) 返回一个 JSON 响应。 当res.send() 的参数是一个对象或者数组的时候, 会调用这个方法。 当然它也在复杂的空值(null, undefined, etc)JSON转换的时候很有用, 因为规范上这些对象不是合法的JSON。

res.json(null)
res.json({ user: 'tobi' })
res.json(500, { error: 'message' })

app

app.configure([env], callback) 当 env 和 app.get('env')(也就是 process.env.NODE_ENV) 匹配时, 调用callback。保留这个方法是出于历史原因,后面列出的if语句的代码其实更加高效、直接。使用app.set()配合其它一些配置方法后,没有必要再使用这个方法。

// 所有环境
app.configure(function(){
  app.set('title', 'My Application');
})

// 开发环境
app.configure('development', function(){
  app.set('db uri', 'localhost/dev');
})

// 只用于生产环境
app.configure('production', function(){
  app.set('db uri', 'n.n.n.n/prod');
})

更高效且直接的代码如下:

// 所有环境
app.set('title', 'My Application');

// 只用于开发环境
if ('development' == app.get('env')) {
  app.set('db uri', 'localhost/dev');
}

// 只用于生产环境
if ('production' == app.get('env')) {
  app.set('db uri', 'n.n.n.n/prod');
}

app.set(‘view engine’,‘html’) 参考:node.js新手,想用ejs,不用jade,但改了之后会报错 app.set(‘view engine’,‘html’); 最简单的理解:只是设置默认的模板文件扩展名而已 就是你在res.render(‘index’)时,会默认加上index.html,但是并没有html引擎。 这也就是说你可以同时使用多个模板引擎。设置了engine之后。res.render才可以用,否则就用res.sendFile(path, callback)

  1. 解决一:http://expressjs.jser.us/api#app.engine

app.engine(ext, callback) 注册模板引擎的 callback 用来处理ext扩展名的文件 默认情况下, 根据文件扩展名require() 对应的模板引擎。 比如你想渲染一个 "foo.jade" 文件,Express会在内部执行下面的代码,然后会缓存require(),这样就可以提高后面操作的性能 app.engine('jade', require('jade').__express); 那些没有提供 .__express 的或者你想渲染一个文件的扩展名与模板引擎默认的不一致的时候,也可以用这个方法。 比如你想用EJS模板引擎来处理 ".html" 后缀的文件: app.engine('html', require('ejs').renderFile); 这个例子中EJS提供了一个.renderFile() 方法和Express预期的格式: (path, options, callback)一致, 可以在内部给这个方法取一个别名ejs.__express,这样你就可以使用".ejs" 扩展而不需要做任何改动 有些模板引擎没有遵循这种转换, 这里有一个小项目consolidate.js 专门把所有的node流行的模板引擎进行了包装,这样它们在Express内部看起来就一样了。

var engines = require('consolidate');
app.engine('haml', engines.haml);
app.engine('html', engines.hogan);
  1. 解决二:
var html = path.normalize(__dirname + '/../views/index.html');
    res.sendfile(html);