返回
编程
分类

选项二是监视文件的变化,这样的话你可以在你任何地方新建sail.js项目)

日期: 2020-04-15 17:21 浏览次数 : 139

导言:

在我们开发php,java等web项目的时候,修改了项目代码,服务器都会自动重启,让我们的改动生效,但是node并不会这样,必须手动去重启一下,这样很烦人的啊,很浪费时间,于是就有大神开发了自动重启的工具——nodemon,很简单的。

初始化服务器

本文介绍的完整代码参见https://github.com/hejinzhi/wechatServer

  1. 输入npm init 初始化项目,全部采用默认值即可。
npm init
  1. 在根目录建立tsconfig.json,代码如下
{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [
      "es6"
    ],
    "outDir": "build",   //编译后文件输出到build这个文件夹内
    "module": "commonjs",
    "target": "es5"
  },
  "include": [
    "*.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}
  1. 安装 Express 框架和 typing 文件
npm install express @types/express @types/node
  1. 在根目录建立app.ts文件,输入以下代码,这样,一个简单的服务器就搭建完毕了。
import * as express from 'express';

const app=express();

app.get('/',(req,res)=>{
    res.send('我已经收到您的请求了');
});

app.listen(3000,'localhost',()=>{
    console.log('server running on http://localhost:3000');
});
  1. 但是nodejs只会认js,怎么把ts转换成js呢?使用vs code的编译功能即可。首先先全局安装typescript。
npm install -g typescript

然后在vs code中按下快捷键ctrl+shift+b,调出编译选项。选项一是根据 tsconfig 的配置把指定的ts编译成js,该动作只会执行一次。选项二是监视文件的变化,如发现有变化,立刻执行编译动作。

必威官网亚洲体育 1

  1. 选择选项二,就会看到vs code已经把ts文件编译成js文件,并放到build文件夹内
![](https://upload-images.jianshu.io/upload_images/7871150-00522c3818b15e9d.png)
  1. 执行node build/app.js 运行,出现以下提示证明服务器已经成功运行起来。

    必威官网亚洲体育 2

打开浏览器,输入[http://localhost:3000/](https://link.jianshu.com?t=http%3A%2F%2Flocalhost%3A3000%2F)就可以看到服务器返回信息了,这样一个最简单的服务器就搭建完毕了。  

![](https://upload-images.jianshu.io/upload_images/7871150-17ad0dbfd59c9574.png)
  1. 服务器已经运行起来,我们稍作调整,让服务器可以提供静态资源的访问。先在根目录下建立文件夹public,放一张图片进去(如1.png),然后修改app.ts如下:
import * as express from 'express';

const app=express();

app.use(express.static('public'));

app.get('/',(req,res)=>{
    res.send('我已经收到您的请求了');
});

app.listen(3000,'localhost',()=>{
    console.log('server running on http://localhost:3000');
});

在浏览器输入http://localhost:3000/1.png,我们会发现报错。原因是我们是使用node来启动app.js的。app.js的代码已经发生了改变,我们需要ctrl+c中断服务,node build/app.js重新执行才可以。

必威官网亚洲体育 3

重新运行后,我们会发现可以访问1.png这张图片了。

  1. 代码每次变更,都需要重启服务器,显得非常麻烦。我们可以nodemon解决这个问题。先全局安装nodemon。
npm install -g nodemon

使用nodemon启动app.js

nodemon build/app.js

必威官网亚洲体育 ,这样,每次ts有变化,编译器会自动把它编译成js,js有变化,服务器就会自动重启。现在我们可以愉快的进行后续的开发了。

  最近在学习sails.js(.

[html]view plaincopy

开始企业微信开发

  1. API官方文档
  2. 要想使用微信的api,必须先向微信服务器申请一个access token.

第三步:获取access_token
请求方式:GET(HTTPS)
请求URL:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRECT
注:此处标注大写的单词ID和SECRET,为需要替换的变量,根据实际获取值更新。其它接口也采用相同的标注,不再说明。

  1. 登录企业微信后台,新建一个应用,应用的名字和图标可自行设置。
![](https://upload-images.jianshu.io/upload_images/7871150-d7d7dff9f637f24f.png)



创建后,点击应用进入详情页,就可以看到AgentId和Secret。这个Secret就是上面提到的corpsecret。



![](https://upload-images.jianshu.io/upload_images/7871150-81ff3c7dab4de784.png)


corpid在这里“我的企业”最底部查到  

![](https://upload-images.jianshu.io/upload_images/7871150-1ca345a203467184.png)
  1. 安装request-promise模块,用于向微信服务器发起请求
npm install request-promise @types/request-promise request @types/request --save

在跟目录建立lib文件夹,在lib内新建Request.ts,对request-promise进行简单的封装。

import * as rp from 'request-promise';

export class Request{
    public static  get (url:string){
        let options={
            method: 'GET',
            uri: url,
            json: true 
        };
        return rp(options);
    }

    public static post (url:string,body:any){
        let options={
            method: 'POST',
            uri: url,
            body: body,
            json: true 
        };

        return rp(options);
    }
}
  1. 在根目录建立wechat文件夹,把跟微信相关的文件都放在一起
  2. 在wechat文件夹内新建config.ts,把一些常量写在里面
export const baseUrl='https://qyapi.weixin.qq.com/cgi-bin/';
export const ApiUrl={
    getToken: baseUrl+'gettoken',
    send:baseUrl+'/message/send',
};

export const AlertModule ={
    corpid:'wx227****',   //修改为对应的id
    corpsecret:'3dDxXtr*****', //修改为对应的secret
    agentId:'1000005'
}
  1. 在wechat文件夹内新建util.ts工具类,用于获取,刷新,本地化存储token,关键代码如下(因代码过长,只截取部分关键代码,完整代码请到这里查看)
    public static async saveToken() {
        let token: Token;
        try {
            let data: Token = await Request.get(ApiUrl.getToken + `?corpid=${AlertModule.corpid}&corpsecret=${AlertModule.corpsecret}`);
            data.expires_time = new Date().getTime() + data.expires_in * 1000;
            token = data;
            fs.writeFileSync(__dirname + '/token.txt', JSON.stringify(token));
        } catch (e) {
            console.log('get token error');
            throw new Error('get token error');
        }

    }
  1. 在wechat文件夹内新建wechat.ts类,把相关的操作都封装在wechat类中
import { NewsMessage, Articles } from './../model/NewsMessage';
import { TextMessage } from './../model/TextMessage';
import { Util } from './utils';
import { ApiUrl } from './config';
import { Request } from './../lib/request';


export class Wechat {


    constructor() {

    }

    public static async sendTextMessage(toUser: string, content: string, agentId: number = 1000005, safe: number = 0) {
        let token = await Util.getToken();
        let body: TextMessage = {
            touser: toUser,
            msgtype: 'text',
            agentid: agentId,
            text: {
                content: content
            },
            safe: safe
        };
        return Request.post(ApiUrl.send + `?access_token=${token}`, body);
    }

    public static async sendNewsMessage(toUser: string, news:Articles[], agentId: number = 1000005, safe: number = 0) {
        let token = await Util.getToken();
        let body: NewsMessage = {
            touser: toUser,
            msgtype: 'news',
            agentid: agentId,
            news:{
                articles:news
            }
        };
        return Request.post(ApiUrl.send + `?access_token=${token}`, body);
    }
}
  1. 让我们修改一下app.ts,让后台给用户推送一条文本消息吧。
import { Wechat } from './wechat/wechat';
import * as express from 'express';


const app=express();

app.use(express.static('public'));

app.get('/',async (req,res)=>{
   await  Wechat.sendTextMessage('FE717','我的第一条推送消息');
    res.send('已成功发出一条消息');
});

app.listen(3000,'localhost',()=>{
    console.log('server running on http://localhost:3000');
});

执行nodemon build/app.js,在浏览器输入http://localhost:3000/即可推送消息。

必威官网亚洲体育 4

  1. 至此,一个简单的企业微信消息推送就完成了。剩下的就是根据业务去写推送逻辑了,本次介绍到此为止,如读者有疑问,可以通过qq:504151911跟我联系,谢谢!

介绍:

npm install -g nodemon

  sails.js的目的是模拟Ruby on Rails那样的mvc模式,帮助开发者快速开发node.js 应用.

在doc下输入上面的,就安装成功了,以后我们启动我们的项目的时候,就输入nodemon server.js

安装:

以前是node server.js

  1.安装 node.js 和 npm, 这里就不说了.

这样,每次我们的js文件修改后,node就会自动重启,就省的我们手动去重启了,这样方便了很多。

  2.安装sails.js ( 加上-g是指全局安装,这样的话你可以在你任何地方新建sail.js项目)

还有一个工具也可以实现同样的需求——supervisor ,但是我不知道为什么我安装的时候总是失败,懒得折腾了,用nodemon就好了。

      windows: npm -g install sails

还有注意一下,这里有一个坑:我一直使用下面的方法启动node:node

      linux: sudo npm -g install sails

这样启动是没有问题的,因为环境变量中配置了node了嘛,但是如果nodemon d:/js/node/app.js

  3.新建一个新的sails.js项目

这样nodemon监视的是启动目录,而不是d:/js/node这个目录,比如c:program>nodemon d:/js/node/app.js

    sails new testProject

他实际上监视的是c:program这个目录,你需要修改启动目录里才可以。

  4.启动新建的项目

来源

    (1). cd testProject

    (2). sails lift    就是扬帆的意思啦 (或者 node app.js) 。 

    PS:node.js每次修改代码都得重启服务器,推荐个nodemon插件 直接 npm install -g nodemon,然后nodemon app.js 以后就不用重启服务器啦。

  5.另外推荐两个学习的开源包。

    简单的:

    较为复杂的: