ionic 后台Api服务, 使用rest-hapi , node.js 创建 RESTful API Service , 附完整源代码

使用node.js创建RESTful 的API Service, 可以选择的框架有 hapi, express 等。 这里笔者推荐使用 hapi框架,会自动创建model 的 CRUD endpoints ,简单易行。 使用过express, 还是有不少坑的, 尤其在client和server端数据交互时,使用中间件body-parse 问题不少, 笔者将在下一篇文章详述。

  1. 安装最新版本 Node.js . Node.js官方下载

  2. 使用 Visual Studio Code 打开一个空的文件夹, 比如 c:\work\ionic\hapi-demo-service ,

  3. 打开Visual Studio Code的终端,输入 npm init , 出现如下所示的信息, 直接按回车使用默认设置即可。也可输入内容替换默认信息。知道出现提示 : is it OK? (yes) ,输入yes 即可。 这时会在hapi-demo-service根目录下生产package.json文件。

C:\Work\Ionic\hapi-demo-service>npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (hapi-demo-service) hapi-demo-service
version: (1.0.0)
description: hapi demo service
entry point: (index.js)
...
Is this OK? (yes) yes
  1. 安装开发包。依次在终端中运行 npm i Hapi --save , npm i mongoose --save

  2. 安装 rest-hapi插件. 终端中输入 npm i rest-hapi --save

  3. 生成service入口类(或者是主类) touch index.js. (index.js 是默认设置, 请参考package.json文件,main节点。
    将如下代码拷贝到index.js

 const Hapi = require("hapi");
let mongoose = require('mongoose');
let RestHapi = require('rest-hapi');
 
 
async function api(){
    try {
      let server = Hapi.Server({
        //Amin: host is important for IOS system. If missing host, the in IOS, it would use machinename.local to replace localhost
        //if post or get request raised ,  there's no response.
        host: 'localhost',
        port: 3001 
     });

      let config = {
          appTitle: "hapi-demo-service",
          version: '1.0.0',
          authStrategy: false ,
          mongo: {
            URI: 'mongodb://localhost/hapi-demo-service'
          }
      }; 
 
     config.embedAssociations = false;

      await server.register({
        plugin: RestHapi,
        options: {
          mongoose,
          config
        }
      });

      await server.start();

      console.log("Server ready", server.info);

      return server;
    } catch (err) {
      console.log("Error starting server:", err);
    }
  }

  module.exports = api();
  1. 生成model类。 VS code 打开终端。输入 mkdir models, 然后再输入 touch models\user.model.js , 此时会生成 user model。 注意目录名称必须是 models , 文件名称需遵循格式 {model name}.model.js.
    将以下代码拷贝到 user.model.js
module.exports = function (mongoose) {
  let modelName = "user";
  let Types = mongoose.Schema.Types;
  let Schema = new mongoose.Schema({
    email: {
      type: Types.String,
      required: true,
      unique: true
    },
    password: {
      type: Types.String,
      required: true,
      exclude: true,
      allowOnUpdate: false
    }
  });
  
  Schema.statics = {
    collectionName: modelName,
    routeOptions: {}
  };
  
  return Schema;
};
  1. 好,大功告成。可以运行程序了。终端输入 node index.js 。 当然,也可以使用 npm start来运行。 将 "start": "node index.js" 添加到package.json的scripts 节点中。
    以下是更新后package.json的 scripts 节点
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node index.js"
  },

运行成功界面如下

C:\Work\Ionic\hapi-demo-service>node index.js  。
以下是运行界面
[14:29:03.251] 16856 LOG      api/mongoose-init — Connecting to Database...:
[14:29:03.260] 16856 LOG      api/mongoose-init —      URI: `mongodb://localhost/hapi-demo-service`
[14:29:03.277] 16856 LOG      api/mongoose-init — mongoose connected
[14:29:03.278] 16856 LOG      api — Initializing Server...
[14:29:03.367] 16856 INFO     api/register-hapi-swagger — hapi-swagger plugin registered
[14:29:03.367] 16856 INFO     api/register-MrHorse — MrHorse plugin registered
Server ready { created: 1530253743241,
  started: 1530253743467,
  host: 'CNSHAEL3Z5Z9H2',
  port: 3001,
  protocol: 'http',
  ...
  address: '0.0.0.0' }
  1. 浏览器中输入 : http://localhost:3001 。使用rest-hapi框架的好处是: 会自动生成CRUD的endpoints.
    测试api方法,这里推荐使用postman. 当然,在浏览器中也是可以测试的。
DELETE /user        Delete multiple users
POST /user          Create one or more new users
GET /user           Get a list of users
DELETE /user/{_id}  Delete a user
GET /user/{_id}     Get a specific user
PUT /user/{_id}     Update a user

运行界面截图:


image.png

创建一个新的User


image.png

使用robot 3T 在 mongo DB 中查看结果,


image.png

最后,附上源代码链接 : https://github.com/amincai/hapi-demo-service
下载到本机后,终端运行 npm i

行文仓促,难免有所错漏或失误,欢迎批评指正。

@caiyaming

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容