MEAN Tutorial

MEAN Tutorial

为了熟悉MEAN基本架构,参考了 https://blog.udemy.com/node-js-tutorial/ 提供的实例。本文对该实例涉及的文件进行梳理。

实例使用的 Express Generator 由 npm 进行安装

npm install express-generator -g

-g 参数说明该nodejs模块采用全局安装的方式 install this package at the global level , 以便于在终端中可直接使用express调用该生成器。

使用

express PorjectName

建立基本的工程目录:

  • bin/
    • www
  • public/
    • images/
    • javascipts/
    • stylesheets/
  • routes/
    • index.js
    • users.js
  • views/
    • error.jade
    • index.jade
    • layout.jade
  • app.js
  • package.json

进入工程目录,使用 nodemon 启动网页服务,默认端口为3000。
同样的,nodemon 可通过npm install -g nodemon安装。

分析 /bin/www的文件内容,其包含如下语句:

var app = require('../app');
var http = require('http');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
var server = http.createServer(app);
...

不难发现 port 决定了服务器的端口,通过修改此处可更改 nodemon 启动的服务端口

/app.js 是服务器的基本配置,实例中通过 app.js 添加基本路由,形如:

var apiName= require('apiPath');
...
app.use('/routePath', apiName);

通过 apiPath 索引至相应的 js 文件以获取返回值,以 index 为例:

./app.js
...
var routes = require('./routes/index');
app.use('/', routes);
...


./routes/index.js
...
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
...

通过该设置,访问网页根目录会返回 render 渲染的 index 界面。由于 app.js 中默认设置了 ./views 作为渲染文件的目录,故会调用 ./views/index.jade 进行渲染。
该实例中使用了 layout.jade 作为网页框架,形如:

doctype html
html(ng-app = 'myApp')
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
    link(rel='stylesheet', href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css')
    script(src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.5/angular.js')
    script(src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.5/angular-resource.js')
    script(src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.5/angular-route.js')
    script(src='/javascripts/myApp.js')
  body
    block content

为了使用 Angular 进行渲染,添加了(ng-ap ='myApp')标签,并引用相应的 js 文件。在此基础上, index.jade 只需要套用 layout.jade , 形如:

extends layout

block content
  div(ng-view)

即使用自己的 block content 替换 layout 中相应的策略。此处增加的 ng-view 标签,为后续添加 Angular 页面路由做准备。

前文中 layout.jade 中 包含了script(src='/javascripts/myApp.js'),且增加了(ng-app='myApp')标签,故可使用 myApp.js 定义路由和控制器,形如:

var app = angular.module('myApp', ['ngRoute', 'ngResource']);

app.config(['$routeProvider', function($routeProvider){
    $routeProvider
        .when('/', {
            templateUrl : 'partials/homePage.html',
            controller : 'contorllerName'
        })
        .otherwise({
            redirectTo : '/'
        })
}]);
...

partials/homePage.html 为新增的引导界面,该界面会替换 index中的<div ng-view>,实现页面路由。

为何不仅仅使用Express的路由,而选择Angular来实现多页面路由?
实例作者给出的解释是,MEAN 基于 RESTful API,完全可以使用JSON对象进行数据传递。与传统的Jade渲染多页面不同的是,MEAN 框架下的后端可选择仅传递 JSON 给前端,使用 Angular 完成渲染。该方案减少了服务器的数据转换开销,同时具有较好的拓展性和延伸性。

继续分析上文中的 myApp.js,该文件中使用controller : 'contorllerName'语句实现 controller 和页面的绑定,而 controller 的实现形如:

./public/partials/homPage.html

<ul>
    <li ng-repeat="data in datas ">{{data.title}}</li>
</ul>
...


./public/javascripts/myApp.js

app.controller('myApp', ['$scope', '$resource',
    function($scope, $resource){
        //data-API
        var dataList = $resource('/datas');
        pollsList.query(function(datas){
            $scope.datas = datas;
            console.log(polls);
        });
    }]);

该部分的代码使用 $resource 模块获取服务器的数据,并绑定 homePage.html 的 datas 。关注 var dataList = $resource('/datas'),该语句会向路由 /datas 发起get请求以获取 json 数据,针对该操作,回顾前文描述的 ./app.js,为实现该接口,我们需要在 ./app.js 中增加形如 :

var dataAPI = require('./routes/api/getData.js');
...
app.use('/datas', dataAPI);

进而在 ./routes/api/getData.js 中实现 get 方法。

var express = require('express');
var router = express.Router();

var monk = require('monk');
var db = monk('localhost:27017/dbName');
/* GET */
router.get('/', function(req, res) {
    var collection = db.get("collectionName");
    collection.find({}, function(err, dataList){
        if(err) throw err;
        res.json(pollsName);
    });
});

该实例使用了 node 的 monk 模块连接 MongoDB 数据库,实现了查询 collection 中所有项并返回相应的 json 对象。该API可通过 http://localhost:port/datas 观察功能是否正确。

至此,实例的基本架构已经分析完成。原实例中完善API实现的post/delete 此处不再详述。

笔者梳理该实例的简单的框架图为:

MEAN 实例框架

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
Stable Baselines3 是一个用于强化学习的Python库,它提供了训练和评估强化学习算法的工具。 要开始使用 Stable Baselines3,首先需要安装它。可以通过 pip 安装稳定的 Baselines3: ``` pip install stable-baselines3 ``` 安装完成后,我们可以导入所需的模块并开始构建我们的强化学习模型。 首先,我们需要选择一个适合我们任务的强化学习算法。Stable Baselines3 提供了多种算法,比如 A2C、PPO、SAC等。选择算法后,我们可以实例化一个模型对象。 ```python from stable_baselines3 import A2C model = A2C('MlpPolicy', 'CartPole-v1', verbose=1) ``` 在这个例子中,我们选择了 A2C 算法,并将其用于 CartPole-v1 的任务。 接下来,我们可以使用模型对象对算法进行训练。 ```python model.learn(total_timesteps=10000) ``` 这里我们使用了 learn 方法来训练模型,total_timesteps 参数指定了总的训练步数。 训练完成后,我们可以使用训练好的模型来进行评估。 ```python mean_reward, std_reward = evaluate_policy(model, 'CartPole-v1', n_eval_episodes=10) ``` 这里我们使用了 evaluate_policy 方法来评估模型的性能,n_eval_episodes 参数指定了评估时的回合数。 除了训练和评估,Stable Baselines3 还提供了其他功能,比如加载和保存模型、可视化训练过程等。 总的来说,使用 Stable Baselines3 进行强化学习任务非常方便。只需要选择适合的算法、构建模型对象、训练和评估模型,就可以快速地开展强化学习研究和应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值