我有一个Chrome扩展程序,它使用W3C Geolocation API来获取用户的位置.该扩展程序主要用于Chromebook.
我注意到API似乎在大多数情况下返回相同的坐标(缓存?),即使我将maximumAge参数设置为0.我通过在位置#1的Chromebook上部署扩展来测试这一点,然后采用设备到位置#2,距离约1公里.在那里再次调用API并返回与之前相同的坐标.过了一会儿(我间隔10分钟),它返回了正确的坐标,但是当我回到位置#1时,我又从位置#2获得了缓存坐标.
我尝试过getCurrentPosition
,watchPosition
以及选项对象的几种组合,但似乎总是产生相同的结果.
我目前的代码如下:
function getGeolocation() {
return new Promise((resolve, reject) => {
const options = { enableHighAccuracy: true, timeout: 30000, maximumAge: 0 };
navigator.geolocation.getCurrentPosition(resolve, reject, options);
});
}
getGeolocation()
.then(position => handler(position))
.catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)
我需要这个在第一次尝试时或在合理的短时间内返回正确的坐标.有什么建议?
谢谢!
编辑:
要注意的是,浏览器传感器选项卡中的坐标更改每次都能正常工作,但在实际情况下,它似乎在大多数情况下都会返回缓存结果.
编辑(11月5日):
经过一些更多测试后,似乎只在Chrome OS上发生这种情况.我们无法在PC上重现相同的行为(有或没有扩展名).
我正在使用Node.js,Mongoose和Koa开发RESTful API,并且对于模式和输入验证的最佳实践有些困惑。
目前,我对每种资源都有Mongoose和Joi模式。猫鼬模式仅包含有关特定资源的基本信息。例:
const UserSchema = new mongoose.Schema({
email: {
type: String,
lowercase: true,
},
firstName: String,
lastName: String,
phone: String,
city: String,
state: String,
country: String,
});
Run Code Online (Sandbox Code Playgroud)
Joi模式包含有关对象的每个属性的详细信息:
{
email: Joi.string().email().required(),
firstName: Joi.string().min(2).max(50).required(),
lastName: Joi.string().min(2).max(50).required(),
phone: Joi.string().min(2).max(50).required(),
city: Joi.string().min(2).max(50).required(),
state: Joi.string().min(2).max(50).required(),
country: Joi.string().min(2).max(50).required(),
}
Run Code Online (Sandbox Code Playgroud)
当写入数据库时,Mongoose模式用于在端点处理程序级别创建给定资源的新实例。
router.post('/', validate, routeHandler(async (ctx) => {
const userObj = new User(ctx.request.body);
const user = await userObj.save();
ctx.send(201, {
success: true,
user,
});
}));
Run Code Online (Sandbox Code Playgroud)
Joi模式在验证中间件中用于验证用户输入。对于每种资源,我有3种不同的Joi模式,因为允许的输入取决于请求方法(POST,PUT,PATCH)而有所不同。
async function validate(ctx, next) {
const user = ctx.request.body;
const …
Run Code Online (Sandbox Code Playgroud) 我有以下promise函数,该函数使用fetch从API获取数据:
const getContacts = token =>
new Promise((resolve, reject) => {
fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
})
.then(response => response.json())
.then((data) => {
resolve(data);
})
.catch(err => reject(err));
});
Run Code Online (Sandbox Code Playgroud)
然后在另一个文件中调用此函数:
getContacts(token)
.then((data) => {
const contacts = data.data;
console.log(contacts);
})
.catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)
当从API返回的数据量较大时,将对其进行分页。响应中包含一个链接,需要获取该链接才能获取下一页。我希望我的代码首先遍历所有页面并收集所有数据,然后解决承诺。当执行到达该const contacts = data.data
行时,它应该具有每个页面的数据(当前它仅返回第一页)。
实现这一目标的最佳方法是什么?
编辑:
我尝试在getContacts函数中进行递归。这样,我可以遍历所有页面并在一个对象中获取所有数据,但是我不知道什么是将其解析回代码(最初称为函数)的正确方法。下面的代码无法正确解析。
const getContacts = (token, allData, startFrom) =>
new Promise((resolve, reject) => {
if (startFrom) {
url = `${url}?${startFrom}`; // the api returns a set …
Run Code Online (Sandbox Code Playgroud)