react-02-又是起手式:同构js

概览:mongodb以及mongoose的使用

在搜集资料时发现同构js也是热门 , 简单的说就是原由客户端js如react渲染页面转由服务器端渲染 , 这样两端共用一套js就可以了. 好处就是方便搜索引擎爬取 .
这里我准备先玩玩这个 , 即前后端写到同一个项目里 , 然后再拆开玩前后端分离.

再创建个项目 , isomorphic-server

创建过程同上一篇 , 这次选择了scss样式编译 , 但遇到了windows下无法启动的问题 , 还是先用css.

mongodb以及mongoose的使用

mongoose文档

先使用最简单的操作姿势

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
var mongoose = require('mongoose');

var uri = 'mongodb://172.19.60.18:27017/local';
//链接数据库
mongoose.connect(uri);
// 定义表结构对象
var userSchema = mongoose.Schema({
name: String,
age: {type: Number, min: 18, max: 25}
});
//表结构对象添加操作方法
userSchema.methods.speak = function () {
var greeting = 'My name is ' + this.name + ' and I am ' + this.age + ' years old';
console.log(greeting);
};
//使用表结构对象结合数据库集合生成集合模型
var UserModel = mongoose.model('user', userSchema, 'user');
UserModel.find({}, function (err, users) {
if (err) console.log(err);
else {
console.log('query users: ');
console.log(users);
}
});
// 创建一个模型实例
var sqq = new UserModel({name: 'qianqian', age: '23'});
sqq.speak();
// 保存这个模型实例
sqq.save(function (err, user) {
if (err) return console.log(err);
user.speak();
});
```

还可以使用mongoose的promises操作方式 , bludbird实现

```javascript
var options = {promiseLibrary: require('bluebird')};
var db = mongoose.createConnection(uri, options);
mongoose.Promise = require('bluebird');

var UserModel = db.model('user', userSchema, 'user');

var query = UserModel.find();
query.where('age').lt(25)
.then(function (err, users) {
if (err) console.log(err);
else {
console.log('query users: ');
console.log(users);
}
});

将 mongoose 应用到项目中

1.链接数据库

在app.js中关键代码

1
2
3
var mongoose = require('mongoose');
require('./modles/user')
mongoose.connect(config.db);

其中 require('./modles/user')为引入数据操作modle ,为批量引入,可优化为:

1
2
3
4
5
6
const fs = require('fs');
const join = require('path').join;
const models = join(__dirname, 'modles');
fs.readdirSync(models)
.filter(file => ~file.search(/^[^\.].*\.js$/))
.forEach(file => require(join(models, file)));

2.建立数据操作层

modles/users.js 关键代码:

1
2
3
4
5
6
7
8
var mongoose = require('mongoose');

var Schema = mongoose.Schema;
var userSchema = new Schema({
name: String,
age: {type: Number}
});
mongoose.model('User', userSchema, 'user');

3.建立控制层

controllers/users.js关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var mongoose = require('mongoose');
var User = mongoose.model('User');

exports.index = function (req, res) {
User.find({}, function (err, users) {
if (err) {
res.send(err);
} else {
console.log('user.find():')
console.log(users)
res.render('user', {title: 'user',users:users});
}
});
};

4.建立路由

routes/users.js:

1
2
3
4
5
6
var express = require('express');
var users = require('../controllers/users');
var router = express.Router();
router.get('/', users.index);

module.exports = router;

5.建立视图模版views/user.jade

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
extends layout

block content
h1= title
p Welcome to #{title}
table(style='border:solid 1px pink')
thead
th 序号
th 姓名
th 年龄
each user,index in users
tr
td #{index}
td #{user.name}
td #{user.age}

6.结果预览

推荐文章