通过一个简单的 Node.js 文件上传应用程序来了解 Codename: BlueMix

在 IBM Codename: BlueMix 中编写、部署、运行和管理一个简单的 Node.js 文件上传应用程序。

Jay Allen, 软件工程师, IBM

Jay Allen 是一名开发人员和架构师,在开发大型企业系统方面拥有多年的经验。他是新兴开发语言、云技术及许多开源框架和库的爱好者。他和妻子、3 个十几岁的孩子和多只小猫一起居住在明尼苏达州罗契斯特市。



Jon Johnson, 计算机科学专业

Johnson,计算机科学专业。



2014 年 4 月 17 日

CodeName:BlueMix 是一款 beta 级产品,随着我们不断让其功能更加完善和更易于使用,它也将不断改进。我们将竭尽全力保持本文最新,但它并不总是完全跟上现状。感谢大家的理解。

本文会让您快速亲自体验 Codename:BlueMix,它可用于开发和部署 Web 和移动应用程序的开放 IBM 云平台。该练习通过一段简短的、紧凑的代码使用了 BlueMix 的主要组件。您将构建一个 Node.js 应用程序,上传一个文件,并将文件内容插入到 MySQL 数据库中。然后您将测试该应用程序,查看如何通过 BlueMix 管理它。我们选择此应用程序的另一个原因是,我们都是 Node.js 的忠实粉丝,会抓住一切可能的机会来更深入地了解它。

构建一个类似应用程序所需的准备工作


第 1 步. 克隆应用程序并为 Codename:BlueMix 做好准备

  1. 从 IBM jStart GitHub 存储库克隆 Node MySQL 上传应用程序:
    git clone https://github.com/ibmjstart/bluemix-node-mysql-upload.git

    所有应用程序逻辑都包含在 app.js 中。在 app.js 中,我们使用了一些不错的 Node 模块,它们简化了 Web 应用程序开发(Express Web 开发框架和针对 Express 的 Hogan 模板引擎),我们还使用了 MySQL 和文件系统模块来简化数据库和文件操作:
    var http = require('http');
    var path = require('path');
    var express = require('express');
    var hogan = require('hogan-express');
    var mysql = require('mysql');
    var fs = require('fs');
  2. 添加您需要添加到应用程序中的独特代码,以便在 BlueMix 中运行它。从应用程序环境中,获得 VCAP_APP_PORTVCAP_APP_HOSTVCAP_SERVICES

    VCAP_APP_HOSTVCAP_APP_PORT 会告诉应用程序,BlueMix 向您的应用程序分配了哪个端口和主机。VCAP_SERVICES 是一个 JSON 对象,只要您绑定到了 BlueMix 服务,您的应用程序就可以使用它。凭据部分对所有服务都是相同的,它包含您连接到该服务所需的所有信息。对于 BlueMix MySQL 服务,凭据通常包含数据库名称、端口、用户 ID 和密码:

    var port = (process.env.VCAP_APP_PORT || 3000);
    var host = (process.env.VCAP_APP_HOST || 'localhost');
    
    // all environments
    app = express();
    
    // check if application is being run in cloud environment
    if (process.env.VCAP_SERVICES) {
      var services = JSON.parse(process.env.VCAP_SERVICES);
    
      // look for a service starting with 'mysql'
      for (var svcName in services) {
        if (svcName.match(/^mysql/)) {
          var mysqlCreds = services[svcName][0]['credentials'];
          var db = mysql.createConnection({
            host: mysqlCreds.host,
            port: mysqlCreds.port,
            user: mysqlCreds.user,
            password: mysqlCreds.password,
            database: mysqlCreds.name
          });
    
          createTable();
        }
      }
    }

    我们设置了 3 个例程,它们都使用了一个简单的 index.html 作为视图。向 /upload 的 post 读取文件,将它拆分为各行,然后将这些行插入到 MySQL 数据库中。

    // upload file
    app.post('/upload', function (req, res) {
      fs.readFile(req.files.file.path, 'utf8', function (err, data) {
        if (err) return res.json(err);
        // split file into array of non-empty Strings
        var posts = data.split(/\r\n?|\n/).filter(isNotEmpty);
        
        // insert posts into mysql db
        addPosts(posts, function (err, result) {
          if (err) return res.json(err);
          var msg = 'Added ' + result.affectedRows + ' rows.';
    
          // display all posts
          getPosts(function (err, posts) {
            if (err) return res.json(err);
            res.render('index.html', {posts: posts, msg: msg});
          });
        });
      });
    });

    addPosts 执行数据库插入,getPosts 从数据库返回这些 post 返回信息,以便在 index.html 视图中使用它们:

    function addPosts(posts, cb) {
      var sql = 'INSERT INTO posts (text) VALUES ?';
      
      var values = posts.map(function (post) {
        return [post];
      });
      
      db.query(sql, [values], function (err, result) {
        if (err) return cb(err);
        cb(null, result);
      });
    }
    
    function getPosts(cb) {
      var sql = 'SELECT text FROM posts';
      db.query(sql, function (err, result) {
        if (err) return cb(err);
        cb(null, result);
      });
    }

第 2 步. 将应用程序推送到 Codename:BlueMix

  1. 安装适用于您系统的 Cloud Foundry V6 命令行接口,如果尚未这样做的话。
  2. 更改到应用程序的应用程序目录,并从您的工作站登录到 BlueMix。命令语法为 cf login -a API_URL。您的登录命令将类似于:
    C:\demo\bluemix-node-mysql-upload\app>cf login -a api.ng.bluemix.net

    系统会提示您输入用户名、密码、组织和空格。
  3. 登录后,创建可供 Node 应用程序使用的 MySQL 服务。命令语法为:
    cf create-service SERVICE PLAN SERVICE_INSTANCE

    服务名称为 mysql,计划为 100,服务实例名称为 mysql-node-upload。所以您将创建自己的 MySQL 服务如下所示:
    C:\demo\bluemix-node-mysql-upload\app>cf create-service mysql 100 mysql-node-upload
  4. 现在到了有趣的部分了。无需获得一个服务器,加载操作系统、Node、npm、MySQL 和补丁代码,然后再没完没了地填入更改通知单,您只需将自己的应用程序推送到 BlueMix,让 BlueMix 去处理这些杂务。

    我们在应用程序中包含了 manifest.yml 文件来简化这一过程。它设置应用程序名称、内存、实例数量以及要使用的 BlueMix MySQL 服务。选择一个不同的主机名,防止您最终的 URL 路由与演示 URL (http://NodeMySQLUploadArticle.ng.bluemix.net) 发生冲突:

    ---
    applications: #Reference 
         http://docs.cloudfoundry.com/docs/using/deploying-apps/manifest.html
    - name: NodeMySQLUpload #Application Name. Unique to the user's Space
      memory: 256M #The maximum memory to allocate to each application instance
      instances: 1 #The number of instances of the application to start
      host: NodeMySQLUploadArticle #Hostname for app routing. 
             Unique to domain ng.bluemix.net.  Change.  
      path: . #Path to the application to be pushed
      command: node app.js #The command to use to start the application
    services: 
    - mysql-node-upload #the already created mysql service

    从包含 app.js 和 manifest.yml 文件的应用程序目录,推送您的应用程序:
    cf push

    在应用程序运行时,访问 http://my-unique-hostname.ng.bluemix.net(其中 my-unique-hostname 是清单文件中的主机)。上传一个文本文件。它起作用了!
图 1. 该屏幕截图显示了 MySQL Upload 应用程序在 Codename: BlueMix 上的用户界面
该屏幕截图显示了 MySQL Upload 应用程序在 Codename: BlueMix 上的用户界面

第 3 步. 从 Codename:BlueMix UI 管理您的应用程序

现在应用程序已在 BlueMix 中运行,我们使用 BlueMix UI 来查看它的各个部分。转到 Codename:BlueMix 并登录。从 BlueMix 仪表板,您将看到一个总结了应用程序信息的磁贴。您可以大体查看 URL 和绑定的服务,看到应用程序是否正在健康的正常运行:

图 2. 该屏幕截图显示了 Codename: BlueMix 上的 MySQL Upload 应用程序状态摘要
该屏幕截图显示了 Codename: BlueMix 上的 MySQL Upload 应用程序状态摘要

单击应用程序磁贴来访问应用程序概述页面,可在这里了解应用程序的更多信息。

图 3. 该屏幕截图显示了 Codename: BlueMix 上的 MySQL Upload 应用程序概述页面
该屏幕截图显示了 Codename: BlueMix 上的 MySQL Upload 应用程序概述页面
  • 访问运行时页面,可在这里调节应用程序实例和内存,并查看应用程序的总体健康状况。
  • 检查文件和日志,可在这里看到部署的应用程序代码和查看暂存、标准输出和标准错误日志。
  • 您还可以重命名应用程序,更改它的 URL,以及停止、启动和删除它。

结束语

就这么简单!简言之,您可以用 IBM Codename: BlueMix 来编写、部署、运行和管理应用程序。您可以继续了解 BlueMix。

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Web development
ArticleID=968365
ArticleTitle=通过一个简单的 Node.js 文件上传应用程序来了解 Codename: BlueMix
publish-date=04172014