數據庫CRUD使用JS SDK
對于增刪改查、連表操作,直接使用瀏覽器JS SDK,在bmob.js,https://www.bmob.cn/static/bmob_jssdk_quickstart.zip,僅需加一個module.exports = Bmob導出,就可以在Node使用了,語法與小程序里寫法一樣優雅,比Bmob提供的npm包要好用N倍。
JS SDK的使用xmlhttprequest作ajax請求,所以node下,還要依賴xmlhttprequest npm包,將"xmlhttprequest": "^1.8.0"添加到package.json dependencies里,同樣再加上"localStorage": "^1.0.3"。這樣就改造完成了。
代碼說話,看對比
以下是Bmob npm庫
-
var BC = require('bmob');
-
BC.initialize("9a22a7cb3217e88cac2e81fe7e88c600", "025c1282712e387a62b2bcd5a970f93c");
-
var db = new BC.Db;
-
db.find({
-
"table":"XXX", //表名
-
"keys":"a,b,c", //返回字段列表,多個字段用,分隔
-
"where":{"a":"XXXX","b":"XXXX"}, //查詢條件是一個JSON object
-
//"where":{"c":{"$ne":1}}, //條件查詢 查詢c字段值不為1的記錄
-
"order":"-a,b", //排序列表,[-]字段名稱,-表示降序,默認為升序
-
"limit":10, //limit大小,一頁返回多少條記錄,默認為0
-
"skip":2, //skip,分頁offset,(page-1)*limit
-
"count":1 //count,只返回符合條件的記錄總數
-
},function(err,data){ //回調函數
-
});
注:對于表關聯include操作,一直沒有發現怎么處理,這是一個硬傷,npm庫也2年多沒有維護了。
以下是改造過的瀏覽器JS SDK
-
//app.js
-
var Bmob = require('./bmob.js');
-
Bmob.initialize("9a22a7cb3217e88cac2e81fe7e88c600", "025c1282712e387a62b2bcd5a970f93c");
-
// bmob
-
var Food = Bmob.Object.extend("Food");
-
var query = new Bmob.Query(Food);
-
query.include('category');
-
query.limit(this.pageSize);
-
query.skip(this.pageIndex * this.pageSize);
-
query.find({
-
success: function(object) {
-
console.log(object);
-
},
-
error: function(object, error) {
-
alert("query object fail");
-
}
-
});
使用connect-multiparty+request.js+RESTFul上傳附件
經過上面的改造,可以操作數據庫,但對于附件上傳,還是要自己再增強
-
'use strict';
-
var router = require('express').Router();
-
var multipart = require('connect-multiparty');
-
var multipartMiddleware = multipart();
-
var path = require('path');
-
var fs = require('fs');
-
var Bmob = require('../util/bmob.js');
-
var {appId, appSecret} = require('../util/config');
-
-
// 添加分類
-
router.post('/upload', multipartMiddleware, function(req, res) {
-
console.log('uploading');
-
// 臨時文件完整路徑
-
var file_url = req.files.file.path;
-
// 截取文件名
-
var filename = path.basename(file_url);
-
console.log(filename)
-
/* request 上傳 */
-
var request = require('request');
-
request.post({
-
headers: {
-
"X-Bmob-Application-Id": appId,
-
"X-Bmob-REST-API-Key": appSecret
-
},
-
url: 'https://api.bmob.cn/2/files/' + filename,
-
body: fs.readFileSync(file_url)
-
}, function optionalCallback(err, httpResponse, body) {
-
if (err) {
-
return console.error('upload failed:', err);
-
}
-
res.send(body);
-
});
-
});
-
-
module.exports = router;
這里要注意,不能像傳統自己服務端那樣使用formData的方式上傳,而是直接給body值——感謝Bmob的magic大大指點,才從坑里出來。
-
//formData: var formData = {
-
// file: fs.createReadStream(file_url),
-
//}
-
-
//或者
-
-
//formData: var formData = {
-
// file: fs.readFileSync(file_url),
-
//}
經過以上2大改造,就可以在Node中優雅得使用Bmob了,我的靈犀外賣后端就是基于這個做出的。
|