以下是一些全栈面试题:
一、后端(以Node.js为例)
- 如何设计一个简单的用户认证系统?
- 答案:
- 数据库设计:创建用户表,包含字段如用户名、密码(加密存储,例如使用bcrypt)、邮箱等。
- 注册流程:
- 前端接收用户输入的注册信息并发送到后端。
- 后端验证输入信息的合法性(如用户名是否已存在、密码强度是否符合要求等)。
- 对密码进行加密处理后,将用户信息插入数据库。
- 登录流程:
- 前端发送登录请求包含用户名和密码。
- 后端查询数据库找到对应的用户记录,使用相同的加密算法验证密码是否正确。
- 如果验证成功,可以生成一个令牌(如JWT - JSON Web Token)返回给前端,前端用于后续的身份验证。
- Node.js中的事件驱动模型是如何工作的?请举例说明。
- 答案:
- Node.js基于事件循环(Event Loop)实现事件驱动模型。
- 例如,在一个HTTP服务器中:
- 当有新的HTTP请求到达时,Node.js会触发一个
request
事件。 - 可以通过监听这个事件来处理请求,如下:
const http = require('http');
const server = http.createServer((req, res) => {
// 处理请求
});
server.listen(3000);
- 这里的
createServer
方法内部设置了对request
事件的监听,当事件发生(有新请求)时执行回调函数。
- 如何优化Node.js应用的性能?
- 答案:
- 代码优化:
- 避免阻塞I/O操作,尽量使用异步函数。例如,使用
fs.readFile
而不是fs.readFileSync
进行文件读取。 - 合理使用缓存,对于经常访问的数据可以缓存到内存中。
- 架构优化:
- 使用集群(Cluster)模块来充分利用多核CPU,创建多个工作进程共享同一个服务器端口。
- 对于数据库操作,使用连接池来减少连接建立和关闭的开销。
二、前端(综合前面提到的部分加上全栈相关)
- 在全栈开发中,如何确保前后端数据交互的安全性?
- 答案:
- 前端方面:
- 对用户输入进行严格验证,防止恶意数据发送到后端。
- 在发送请求时,对敏感数据进行加密(如密码等)。
- 后端方面:
- 验证接收到的数据的合法性,包括数据格式、范围等。
- 对用户身份进行严格认证(如使用前面提到的用户认证系统),防止未授权访问。
- 使用安全的传输协议(如HTTPS)来加密数据传输过程。
- 如何构建一个全栈应用的可扩展架构?
- 答案:
- 分层架构:
- 前端采用组件化的架构,方便功能的复用和扩展。
- 后端采用分层架构,如表现层、业务逻辑层、数据访问层等,各层之间职责明确,便于维护和扩展。
- 微服务架构(对于较大规模的应用):
- 将后端的不同功能模块拆分成独立的微服务,每个微服务可以独立开发、部署和扩展。
- 前端可以通过API网关与各个微服务进行交互。
- 数据库设计方面:
- 采用合适的数据库架构,如关系型数据库和非关系型数据库结合使用,以满足不同的数据存储需求。
- 在全栈开发中,如何处理跨域问题?
- 答案:
- 后端设置:
- 在Node.js中,可以使用
cors
中间件来允许特定的源访问后端资源。例如:
const cors = require('cors');
app.use(cors({
origin: 'http://example.com'
}));
- 也可以手动设置响应头来允许跨域,如
Access - Control - Allow - Origin
等头信息。 - 前端代理(在开发环境下):
- 在一些前端构建工具(如Webpack)中,可以设置代理。例如,在
webpack.config.js
中配置代理规则,将前端的某些请求代理到后端服务器,绕过浏览器的同源策略限制。