node实战

本文介绍了一个基于Node.js、Express和MongoDB的实战项目,通过创建一个包含增删改查功能的应用,介绍了如何搭建Node.js环境、使用Express插件、配置Jade模版引擎及Bower包管理工具,并实现从前端到后端的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

了解node的特点和运行
从实战的角度去看待nodejs
完成node 基本的增删改查

所用到的技术点

后台:

node
express插件

前端使用的是

jade模版引擎
bower 包管理工具

数据库:

mongodb

效果图

首页列表页
这里写图片描述

详情页:
这里写图片描述

录入页
列表内容

后台列表页

这里写图片描述

首先启动node服务,引入express 创建四个页面的实例


var express =require('express')  //引入express 

var bodyParser = require('body-parser')
//bodyParser中间件用来解析http请求体,是express默认使用的中间件之一

var port = process.env.PORT || 3000 //端口
var path = require('path')  // 路径
var app = express()  //创建app实例

app.set('views','./views/pages') //设置默认的视图入口
app.set('view engine', 'jade') ////设置默认的模板引擎


pp.use(bodyParser.urlencoded({ extended: true })) //表单数据格式化

app.use(bodyParser.json())

app.use(express.static(path.join(__dirname,'public')))//利用express托管静态文件

app.listen(port);//监听端口

app.get('/',function(req,res){

        res.render('index',{  //我们渲染的模版引擎是index 然后我们的数据有title 和 movies  movies 是一个数组,里面的数据将会再jade的模版下遍历
            title:'首页',
            movies:[{
            title:'海贼王1',
            _id:1,
            poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
        },{
            title:'海贼王2',
            _id:2,
            poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
        },{
            title:'海贼王3',
            _id:3,
            poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
        },{
            title:'海贼王4',
            _id:4,
            poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
        },{
            title:'海贼王5',
            _id:5,
            poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
        },{
            title:'海贼王6',
            _id:6,
            poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
        }]
        })
})


我们再来看jade下index的模版是怎么写的

extends ../layout  //继承 layout.jade 里的东西
block content
    .container  
        .row
            each item in movies  //遍历出来上面数组的内容   想 vue 里面的  v-for  tp 里面的 volist
                .col-md-2
                    .thumbnail
                        a(href="movie/#{item._id}")
                            img(src="#{item.poster}",alt="#{item.title}")
                        .caption
                            h3 #{item.title}
                            p: a.btn.btn-primary(href="/movie/#{item._id}",role="button") 观看预告片

其他的页面类似

那么问题来了 我们怎样从数据库里面获取数据呢

这就需要我们链接上 mongodb

首先在app.js里面 连接上mongodb


var mongoose =require('mongoose')
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost:27017/nodetest');
mongoose.connection.on('connected', function(){
    console.log('Connection success!');
});

然后呢 我们需要 了解一些概念

Schema ModelSchema是一个文档的数据结构,正如我前面提到的,它在Mongoose是一个JSON对象。它最大的特点就是无需确定字段的大小,这特别适用于需要改变对象大小的情况,它支持8种数据类型(StringNumberDateBoolean和Buffer、ObjectId、Mixed、ObjectId、Mixed、Array)。Buffer是用来存储2进制数据,ObjectId是不同于_id的特定的识别符。Mixed可以指定任意类型,不过Mongoose不会自动识别。Array用来存放基本数据类型,也可以是子文档
Model是对应Schema的编译版本,一个model的实例直接映射为数据库中的一个文档。基于这种关系,model处理所有的文档交互)。我们通过 mongoose.model(modelname, schemaName) 来构建model。这样一来我们就可以一鼓作气地将数据存入数据了


var mongoose = require('mongoose')  //引入mongoose

var MovieSchema = new mongoose.Schema({ //new  一个新的 model
    doctor:String,
    title:String,
    language:String,
    country:String,
    summary:String,
    flash:String,
    poster:String,
    year:Number,
    meta:{
        createAt:{
            type:Date,
            default:Date.now()
        },
        updateAt:{
            type:Date,
            default: Date.now()
        }
    }
})

MovieSchema.pre('save',function(next){ //模型的save方法 每次保存的时候都要执行这个方法 相当中间件
    if (this.isNew) {
        this.meta.createAt = this.meta.updateAt = Date.now()
    }
    else{
        this.updateAt = Date.now()
    }
    next()
})

给模式MovieSchema添加静态方法
fetch查询所有数据。findById查询单条数据

MovieSchema.statics = {
    fetch:function(cb){
        return this
            .find({})
            .sort('meta.updateAt')
            .exec(cb)
    },
    findById:function(id,cb){
        return this
            .findOne({_id:id})
            .exec(cb)
    }
}

module.exports = MovieSchema   //为mongodb定义了这个数据模型Movie , 这个数据模型和当前的数据库绑定了;


我们再来看

var mongoose = require('mongoose')

var MovieSchma =require('../schemas/movie')  //引入了上面的 文件 然后呢相当于   var MovieSchma  =MovieSchema 

var movie =mongoose.model('movice',MovieSchma)  //对movice   使用这个模型

module.exports = movie

app.js里面添加
var Movie=require('./models/movie')//加载movie


然后我们改写
app.get('/',function(req,res){
    Movie.fetch(function(err,movies) {  //查出 movies 表的信息 
        if (err) {
            console.log(err);
        }
        res.render('index',{
            title:'首页',
            movies:movies //然后吧返回的 movies数据 赋值给
        })
    })

})

我们就从数据库里面取出了数据 
其他的页面都是采用这种方式进行的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值