leancloud / leanengine-node-sdk Goto Github PK
View Code? Open in Web Editor NEWLeanEngine Node.js SDK
Home Page: https://leancloud.cn
License: MIT License
LeanEngine Node.js SDK
Home Page: https://leancloud.cn
License: MIT License
我想知道这个配置文件是什么 我在函数初始化时候已经传入了必要参数
除了模块依赖之外。
的代码
//init leanCloud
lg.init({
appId: process.env.LEANCLOUD_APP_ID || 'GcEEi4mef5f6LjXb....省略',
appKey: process.env.LEANCLOUD_APP_KEY || 'PI2khm4E6....省略',
masterKey: process.env.LEANCLOUD_APP_MASTER_KEY || '1EXlsv8....省略'
});
lg.Cloud.useMasterKey();
// 声明一个 Todo 类型
var Todo = lg.Object.extend('Todo');
// 新建一个 Todo 对象
var todo = new Todo();
todo.set('title', '工程师周会');
todo.set('content', '每周工程师会议,周一下午2点');
todo.save().then(function(todo) {
// 成功保存之后,执行其他逻辑.
console.log('New object created with objectId: ' + todo.id);
}, function(error) {
// 异常处理
console.error(error);
});
似乎不显式 200 就会被 koa 认为是 404 ...
https://leanticket.cn/t/leancloud/2134
如果没有 sessionToken,写入的 Cookie 是无法起作用的,可以考虑:抛出异常、打印警告、自动根据 id 获取 sessionToken.
RT
我看到 JavaScript SDK 最新的代码已经会用 debug 模块记录每个请求的参数和响应了,可以在文档上补充一个段落告诉用户如何打开(加环境变量)。
https://github.com/leancloud/javascript-sdk/blob/master/src/request.js
如题,建议更改目前用户登录的设计。
process.domain在未来会被废弃,其他会导致 process.domain 丢失的情况暂不明确
类似 beforeSave,约定保持一致,只是名字换了
今天凌晨上线。
beforeSave 的 request.object
是将更新作用到当前对象后的临时新对象,它不保证是对象更新后的状态,而只是“当时”的最新状态。
相关 ticket:https://ticket.leancloud.cn/tickets/8461
因为 JS SDK 取消了 AV.Error:
AV.Error() is deprecated, and will be removed in next release.
很多用户会疑惑应该如何在 response.error 时指定 code,目前的替代方案是(注意是 message 而不是 error):
response.error({"code":"4444","message":"请先登录!"})
可能需要改进一下这个 API(例如将 code 作为第二个参数)并补充到文档上。
https://forum.leancloud.cn/t/hook/14512
这个问题, @jysperm 说是:2.0 和命令行工具配合的一个 Bug,升级到最新版可解。
既然界定为我们的锅的 bug,能否主动在云引擎日志里告知用户升级 SDK。 @aisk @sdjcw 大佬们来出出主意。
例如
query = new AV.Query(Post)
query.include('comment').find().then(function(post){
res.sucess(post)
})
前端接受到的 post 的 comment 字段会丢失
由用户自己安装维护 avoscloud-sdk 的版本,避免出现现在 sdk 会自动升级的问题。
leanengine-sdk 本身不再持有 AV,需要用户初始化传进来:
var AV = require('leanengine')(require('avoscloud-sdk'));
从代码看,目前只有「自定义函数」与所有「after」类型的 hook 的 request 参数带有 meta 信息。
类似命令行工具之前的 localhost:3000/avos 页面。
koa needs a generator function.So I couldn't make it works like the example:
// cloud.js
var AV = require('leanengine');
AV.Cloud.define('hello', function(request, response) {
response.success('Hello world!');
});
module.exports = AV.Cloud;
var koa = require("koa");
var cloud = require('./cloud');
var app = koa();
app.use(cloud);
module.exports = app
It throw an error:AssertionError: app.use() requires a generator function
.
superAgent
.get(bookUrl)
.set({
Referer: "http://book.douban.com/",
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0'
}).end(function (err, res) {
console.log('begin parsing',err);
})
在部署到实例后会获得403错误的页面
在数据库中,有beforeSave hook的新创建的User是这样的:
{
"result": {
"email": "xxxxxxxx",
"username": "xxxx",
"emailVerified": false,
"__before": 1432921032633,
"mobilePhoneVerified": false,
"somecustomattr": "somevalue"
},
"ACL": {
"*": {
"write": true,
"read": true
}
},
"objectId": "5568a3c8e4b0a9a97408bfbe",
"createdAt": "2015-05-30T01:37:12.676Z",
"updatedAt": "2015-05-30T01:37:12.676Z"
}
回滚LeanEngine SDK 仍然 出现此问题。
回滚到CloudCode 2.0版本,没有 出现此问题。
使用在线定义函数,没有 问题。
猜测是由于beforeSave返回的数据格式不对,不应该带有{"result": data}.
在leanengine/lib/leanengine.js中:
beforeSave hook中将obj返回给callback:
324 Cloud.__code[hook + className]({
325 user: user,
326 object: obj
327 }, {
328 success: function() {
329 if ('__before_delete_for_' === hook) {
330 return cb(null, {});
331 } else {
332 return cb(null, obj);
333 }
334 },
335 error: function(err) {
336 cb(new Error(err));
337 }
338 });
这个callback在此定义:
196 var cb = function(err, data) {
197 if (err) {
198 return respError(res, err);
199 }
200 return resp(res, data);
201 };
resp返回{"result": data},将刚创建的object给返回了
247 var resp = function(res, data) {
248 res.setHeader('Content-Type', 'application/json; charset=UTF-8');
249 res.statusCode = 200;
250 return res.end(JSON.stringify({"result": data}));
251 };
经过和晓丹的讨论 https://github.com/leancloud/uluru-platform/issues/2101 ,beforeUpdate 中支持:
res.success(['a', 'b']); // 允许更新 a, b 两列
res.success(); // 兼容原有写法,等价于 res.success(req.object.updatedKeys);
然后 Node SDK 向云存储返回一个数组结果表示允许更新的列,旧版本会返回 req.object.
leanengine.js 中 Cloud.use(route, bodyParser.json());
使用了 limit 的默认值 100k.
有用户遇到了这个问题: https://forum.leancloud.cn/t/string/5881
来源:https://forum.leancloud.cn/t/topic/14171
用户表示:要不然我们都不知道,是在上线新版本时才发现这个问题,吓出一身冷汗。
Node.js 4.0 已经不推荐使用 domain 模块,所以我们未处理异常的处理方式要修改了。可能还是要使用 https://nodejs.org/api/process.html#process_event_uncaughtexception ,顺便看下 https://nodejs.org/api/process.html#process_event_unhandledrejection ,关于 promise 未处理异常的处理。
有用户希望在普通 Express 路由中使用这两个中间件(
leanengine-node-sdk/lib/leanengine.js
Lines 85 to 181 in 5d9532e
主要是为了在更新 JavaScript SDK 2.0 的时候顺便做一些不兼容的修改,尽量能够在一个月内发布:
还有一些不太可能引起不兼容的修改,可以做也可以往后放一放:
如果用户的 cookie 已经失效(比如在服务端用户被删掉/更换了 secret key),
av.Cloud.logInByIdAndSessionToken
无法正确返回,而这里也未做任何异常处理,导致用户直接拿到 500(应该清除 cookie)。
Variable 'masterKey' implicitly declared.
masterKey = req.body._MasterKey;
AV.Cloud.run 支持 Promise 方式调用
记录包括:请求次数,响应时间,响应码等信息。
分为 5 秒钟的实时信息和 5 分钟的持久化信息。
https://github.com/leancloud/leanengine-node-sdk/blob/master/lib/leanengine.js#L266
Cloud.run = function(name, data, options) {
try {
Cloud.__code[name]({params: data, user: AV.User.current()}, options );
} catch (err) {
console.log('Run function \'' + name + '\' failed with error:', err);
options.error(err);
}
};
这里返回的是 promise
https://github.com/leancloud/javascript-sdk/blob/master/lib/cloudfunction.js#L28
run: function(name, data, options) {
var request = AV._request("functions", name, null, 'POST',
AV._encode(data, null, true));
return request.then(function(resp) {
return AV._decode(null, resp).result;
})._thenRunCallbacks(options);
},
导致我迁移后的代码都不能用了
leanengine-node-sdk/lib/av-extra.js
AV.User._saveCurrentUser = function(user) {
debug('_saveCurrentUser %s', user.get('username'));
if (process.domain) {
if (process.domain._currentUser === user) {
return;
}
if (process.domain._currentUser) {
AV.User.logOut();
}
if (user) {
user._isCurrentUser = true;
}
process.domain._currentUser = user;
return;
}
throw new Error('请添加 AV.Cloud.CookieSession 中间件以支持 AV.User 的操作。');
};
先设置了_isCurrentUser在高并发情况下会导致串号
AV.User._saveCurrentUser = function(user) {
debug('_saveCurrentUser %s', user.get('username'));
if (process.domain) {
if (process.domain._currentUser === user) {
return;
}
if (process.domain._currentUser) {
AV.User.logOut();
}
if (user) {
process.domain._currentUser = user;
user._isCurrentUser = true;
}
return;
}
throw new Error('请添加 AV.Cloud.CookieSession 中间件以支持 AV.User 的操作。');
};
leanengine-node-sdk/lib/leanengine.js
Line 270 in 4bfec51
hook 回调中的 request.object
没有正确处理 _File
类型。所以 url()
等 api 不可用。
比如:入口文件、启动顺序、安装了哪些到哪个目录?这些隐含的步骤
将这部分文档说明补充到 云引擎指南 的文档,说明下这个东西的意义和相关代码。
query.notContainedIn('objectId', [array])会错误,而且错误都是undefined
之前曾在 https://github.com/leancloud/cloud-code/issues/756 讨论过,结论是因为 Promise 只能够表示「成功」和「不成功」两种状态,而我们的云函数实际上有「成功」、「失败」、「出现异常」三种情况。
目前云函数会用 domain 捕捉异步的异常,但因为 domian 本身的不确定性,在之后的 Node 版本中不好保证一定有效。@leeyeh 提议支持用 Promise 去表示「出现异常」的情况,即也去捕捉通过 Promise 传递出的异常,保持和同步异常一样的处理方式。
var Topic = AV.Object.extend('Topic');
AV.Cloud.define('func', function(request, response) {
var query = new AV.Query(Topic);
query.find({
sessionToken: request.user._sessionToken,
success: function(results) {
response.success(results);
}
})
});
实现简单、容易理解;但用户需要修改现有代码,很容易遗漏某些地方,需要在函数间传递 user.
AV.Cloud.define('func', function(request, response) {
var Topic = request.AV.Object.extend('Topic');
var query = new AV.Query(Topic);
query.find({
success: function(results) {
response.success(results);
}
})
});
可以通过改写 AV._request 来实现,用户需要修改一部分代码,也需要在函数间传递 AV.
用leancloud存储功能查询后能不能不返回promise,我想用async await 来处理
但似乎这三个属性并没有被用到,却会增加和其他 session 中间件冲突的风险。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.