社交网络已经成为了现代生活中不可或缺的一部分,为人们提供了更加便捷的沟通和交流方式。如果你想要构建一个社交网络应用程序,那么 Express.js 和 MongoDB 就是你需要的工具。
在本文中,我们将介绍如何使用 Express.js 和 MongoDB 构建一个简单的社交网络应用程序。我们将涵盖以下主题:
- 安装和配置 Express.js 和 MongoDB
- 创建用户账户和登录系统
- 存储用户信息和社交网络数据
- 构建社交网络功能,例如发布帖子、评论和点赞
- 部署应用程序
安装和配置 Express.js 和 MongoDB
在开始之前,你需要安装 Node.js 和 MongoDB。安装完成之后,我们可以使用 npm 安装 Express.js 和相关的依赖项。
npm install express body-parser mongoose passport passport-local express-session bcrypt
在安装完成之后,我们需要设置 Express.js 应用程序和 MongoDB 数据库的连接。在你的项目根目录下,创建一个名为 app.js
的文件,并添加以下代码:
// javascriptcn.com 代码示例 const express = require('express'); const bodyParser = require('body-parser'); const mongoose = require('mongoose'); const passport = require('passport'); const LocalStrategy = require('passport-local').Strategy; const session = require('express-session'); const bcrypt = require('bcrypt'); const app = express(); const port = process.env.PORT || 3000; app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); mongoose.connect('mongodb://localhost/social_network', { useNewUrlParser: true }); mongoose.connection.on('error', () => { console.log('MongoDB connection error. Please make sure MongoDB is running.'); process.exit(); }); app.use(session({ secret: 'your_secret_key', resave: true, saveUninitialized: false, })); app.use(passport.initialize()); app.use(passport.session()); const User = require('./models/user'); passport.use(new LocalStrategy((username, password, done) => { User.findOne({ username: username }, (err, user) => { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username.' }); } bcrypt.compare(password, user.password, (err, res) => { if (res) { return done(null, user); } else { return done(null, false, { message: 'Incorrect password.' }); } }); }); })); passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser((id, done) => { User.findById(id, (err, user) => { done(err, user); }); }); app.listen(port, () => { console.log(`Server running on port ${port}`); });
创建用户账户和登录系统
接下来,我们需要创建用户账户和登录系统。我们将使用 Passport.js 和 bcrypt 来处理用户认证和密码加密。
首先,我们需要创建一个名为 user.js
的模型,并添加以下代码:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const bcrypt = require('bcrypt'); const userSchema = new mongoose.Schema({ username: { type: String, unique: true }, password: String, name: String, email: String, }); userSchema.pre('save', function(next) { const user = this; if (!user.isModified('password')) { return next(); } bcrypt.genSalt(10, (err, salt) => { bcrypt.hash(user.password, salt, (err, hash) => { user.password = hash; next(); }); }); }); userSchema.methods.checkPassword = function(password, callback) { bcrypt.compare(password, this.password, (err, res) => { callback(res); }); }; const User = mongoose.model('User', userSchema); module.exports = User;
接着,在 app.js
中添加以下代码:
// javascriptcn.com 代码示例 app.post('/signup', (req, res) => { const { username, password, name, email } = req.body; User.findOne({ username: username }, (err, user) => { if (user) { return res.json({ error: 'Username already exists.' }); } const newUser = new User({ username, password, name, email }); newUser.save((err) => { req.login(newUser, (err) => { if (err) { return res.json({ error: err }); } return res.json({ success: true }); }); }); }); }); app.post('/login', passport.authenticate('local'), (req, res) => { return res.json({ success: true }); }); app.get('/logout', (req, res) => { req.logout(); return res.json({ success: true }); });
现在,我们已经可以创建用户账户、登录和注销了。在浏览器中访问 http://localhost:3000/signup
和 http://localhost:3000/login
来测试这些功能。
存储用户信息和社交网络数据
接下来,我们需要存储用户信息和社交网络数据。我们将使用 Mongoose 来定义模型并与 MongoDB 数据库进行交互。
首先,我们需要创建一个名为 post.js
的模型,并添加以下代码:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const postSchema = new mongoose.Schema({ user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, text: String, likes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], comments: [{ user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, text: String, }], }); const Post = mongoose.model('Post', postSchema); module.exports = Post;
然后,在 app.js
中添加以下代码:
// javascriptcn.com 代码示例 const Post = require('./models/post'); app.post('/posts', (req, res) => { const { text } = req.body; const post = new Post({ user: req.user._id, text }); post.save((err) => { if (err) { return res.json({ error: err }); } return res.json({ success: true }); }); }); app.get('/posts', (req, res) => { Post.find().populate('user', 'username').populate('likes', 'username').populate('comments.user', 'username').exec((err, posts) => { if (err) { return res.json({ error: err }); } return res.json({ posts: posts }); }); }); app.post('/posts/:id/like', (req, res) => { Post.findByIdAndUpdate(req.params.id, { $addToSet: { likes: req.user._id } }, (err, post) => { if (err) { return res.json({ error: err }); } return res.json({ success: true }); }); }); app.post('/posts/:id/comment', (req, res) => { const { text } = req.body; const comment = { user: req.user._id, text }; Post.findByIdAndUpdate(req.params.id, { $addToSet: { comments: comment } }, (err, post) => { if (err) { return res.json({ error: err }); } return res.json({ success: true }); }); });
现在,我们已经可以创建帖子、获取帖子列表、点赞和评论了。在浏览器中访问 http://localhost:3000/posts
来测试这些功能。
构建社交网络功能
最后,我们需要构建社交网络功能,例如关注和查看个人资料。
首先,我们需要创建一个名为 follow.js
的模型,并添加以下代码:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const followSchema = new mongoose.Schema({ follower: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, following: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, }); const Follow = mongoose.model('Follow', followSchema); module.exports = Follow;
然后,在 app.js
中添加以下代码:
// javascriptcn.com 代码示例 const Follow = require('./models/follow'); app.post('/follow', (req, res) => { const { following } = req.body; const follow = new Follow({ follower: req.user._id, following }); follow.save((err) => { if (err) { return res.json({ error: err }); } return res.json({ success: true }); }); }); app.get('/profile/:id', (req, res) => { User.findById(req.params.id, (err, user) => { if (err) { return res.json({ error: err }); } Follow.findOne({ follower: req.user._id, following: req.params.id }, (err, follow) => { if (err) { return res.json({ error: err }); } return res.json({ user: user, following: !!follow }); }); }); });
现在,我们已经可以关注用户和查看个人资料了。在浏览器中访问 http://localhost:3000/profile/:id
来测试这些功能。
部署应用程序
最后,我们需要将应用程序部署到云服务器上。我们可以使用 Heroku 或 AWS 等云服务提供商来完成这个过程。
首先,我们需要创建一个名为 Procfile
的文件,并添加以下代码:
web: node app.js
然后,我们需要将应用程序部署到云服务器上。在 Heroku 上,我们可以使用以下命令完成部署:
heroku create git push heroku master heroku open
现在,我们已经可以在云服务器上运行我们的应用程序了。在浏览器中访问应用程序的 URL 来测试这些功能。
总结
在本文中,我们介绍了如何使用 Express.js 和 MongoDB 构建一个简单的社交网络应用程序。我们涵盖了用户认证、数据存储和社交网络功能等主题,并提供了示例代码和部署指南。希望这篇文章能够帮助你构建自己的社交网络应用程序。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6580f975d2f5e1655dc2d513