前端面试题你能答对几道?(二)

137 阅读2分钟

前言

今天我们再来三道面试题,有人说这些面试除了面试的时候用,平常的时候根本没有太大用处。

怎么说呢,面试题一是基本知识的考察,能让你在使用的时候快速回想起来;二是,随着你工作年限的提升,如果你连基础知识都还要百度,是不是有些说不过去;

我们今天讲的面试题,主要是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为什么要区分appserver
  • process.cwd()__dirname区别

参考