前言
今天我们再来三道面试题,有人说这些面试除了面试的时候用,平常的时候根本没有太大用处。
怎么说呢,面试题一是基本知识的考察,能让你在使用的时候快速回想起来;二是,随着你工作年限的提升,如果你连基础知识都还要百度,是不是有些说不过去;
我们今天讲的面试题,主要是nodejs方面的,也是偏应用方面的,帮助我们查漏补缺
1. 提供一些区分dev和prod环境的配置文件的例子
- 配置是分层和方便查找的
- key值是能够从环境变量或文件中读取的
考虑如下的配置文件
const config = {
production: {
mongo : {
billing: '****'
}
},
default: {
mongo : {
billing: '****'
}
}
}
exports.get = function get(env) {
return config[env] || config.default;
}
他的使用方法
const config = require('./config/config.js').get(process.env.NODE_ENV);
const dbconn = mongoose.createConnection(config.mongo.billing);
2. 为什么要区分Express的app和server?
保持API声明从网络相关的配置(port,protocol,etc)中分离出来,允许单独测试在进程中测试API,而不用执行网络的回调
它带来的好处有以下几个方面:
- 快速测试执行和获取代码覆盖率
- 允许在不同的网络配置条件下部署app
- 更好的关注点分离和清晰的代码
API声明,应该在app.js中
const app = express();
app.use(bodyParser.json());
app.use("/api/events", events.API);
app.use("/api/forms", forms);
服务网络声明,应该放在/bin/www:
const app = require('../app');
const http = require('http');
/**
* Get port from environment and store in Express.
*/
const port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
const server = http.createServer(app);
3. process.cwd()和__dirname的不同点是什么?
cwd是全局对象process的一个方法, 返回一个node.js进程的当前工作目录的字符串值__dirname是作为字符串值的当前脚本的目录名,__dirname不是一个全局的,而是本地每个模块的
考虑下面的项目结构
Project
├── main.js
└──lib
└── script.js
假设我们有一个文件script.js在project的子目录,例如C:/Project/lib/script.js
node ./main.js
require('./lib/script.js')
console.log(process.cwd())
// C:\Project
console.log(__dirname)
// C:\Project
console.log(__dirname === process.cwd())
// true
node ./lib/script.js 此处注意,我们是在project中运行lib/script文件
console.log(process.cwd())
// C:\Project
console.log(__dirname)
// C:\Project\lib
console.log(__dirname === process.cwd())
// false
所以process.cwd()取决于当前终端的运行目录,而__dirname取决于当前的文件所在的目录
总结
今天我们做一个总结
- 学习了如何写配置文件
- 学习了
Express为什么要区分app和server process.cwd()和__dirname区别