Tinkerer
Code and Climate Change. Blog about software development in ClimateTech
Maybe software-development used to be different. Maybe you spent hours devising algorithms, huddled together over whiteboards until your markers ran out and you were covered in sweat and dried-out coffee spots.
For most of us, that’s not quite the case anymore — most of modern software development consists of googling the right terms.
Surprisingly, figuring out what “the right terms” are can be pretty difficult. Especially if you’re new to programming or the technology you’re currently using.
This is the first in a series about how to google Error Messages. However to find the right search terms, we first need to understand just how to read an error message, and what parts are relevant. I’ll try to use different programming languages throughout, so we can see the differences and the similarities between them. Let’s dive in!
Anatomy of an Error Message
Error messages consist of two parts, the error message and the stack trace.
The error-message is “what’s wrong” — good error messages are helpful and tell you what you should do and bad error-messages sometimes look like something that could summon Cthulhu.
The stack-trace on the other hand is “where it’s wrong.”
Note that stack-traces have different names in different languages, Python calls them tracebacks — the core concept is the same however.
Now when googling what’s going wrong — you use the error message more often than the stack trace. The stack trace is useful as it tells us all kinds of contextual information — e.g. which line you’re making a mistake, or what library is throwing an error.
Anatomy of a Javascript Error Message
Let’s try to look at a very small Javascript program to see how we can use both the error message and the stack-trace.
This is the reasonably simple program. It consists of three files. The first index.js
is where the application starts, the next some-random-file.js
doesn’t do much — it’s just there to make the stack-trace longer, and server.js
starts an express
server listening on port 3000.
If we accidentally run this program twice at the same time, we’ll get an error — as the port is already taken. We’ll get the following error message and stack trace.
Stack-traces (often) go from the oldest entries in the bottom to the newest on the top. Let’s see if we can split this one into into several parts.
Startup-noise
These often happen when using frameworks. What they have in common, is that they’re usually runtime initialization logic, and most of the times they have nothing to do our actual error.
It can be hard to tell what’s startup-noise when starting out, but after having seen a few errors you usually learn to tune it out pretty quickly. A good rule of thumb is that anything between the first line of your code and the start of the stack trace is potentially startup-noise.
In this particular example, the first line is startup-noise.
Your code
This is the code you’ve written. You can usually tell what code is yours from the file names or paths. In this case we can see: "/home/geewee/WebstormProjects/myproject/index.js:5:1"
which is the path to our index.js
file.
There’s two parts of our code are a little more special than the others. The first line of your code is important, as the lines before it are often startup-noise.
The most important part however, is the last line of your code.
Last line of your code.
This is often where the magic happens. What you’re looking for is the last line of the stack trace that you wrote. This means the last line that’s not from the language runtime or libraries you’re using. It’s usually the most interesting line, as this is the last line where you could have made a mistake.
In this particular example, the last line of our code is:
"module.exports.startServer (/home/geewee/WebstormProjects/myproject/server.js:8:9)"
That means server.js line 8 is a good place to start looking for what we’re doing wrong.
Line after the last line of your code
This line is important, if it exists because it usually tells us what library or third party code the error happens in. In this case, the line is:
"Function.listen (/home/geewee/WebstormProjects/myproject/node_modules/express/lib/application.js:618:24)
”
Worth noting here, is that the path is from our project directory into node_modulesexpress
.
Now node_modules/
is the directory where Javascript stores libraries. This means that the error is happening within the express
library. This is useful because we want to know this when figuring out what we should search for later.
Internal third party calls
If the actual error happens in a third party library, there will often be some internal calls before the actual error is thrown. The internal third party calls are the lines between the last lines of your code and the actual error message. They sometimes give more context as to what exactly is going wrong, but often they’re not that important.
The actual error message:
The last important part is the actual error message. It’s not necessarily at the very top of the stack trace, but it’s usually pretty close. In this case it’s this part:
Error: listen EADDRINUSE :::3000
This is the part we’ll be using in our search queries. In this case the error message can roughly be translated to “Address 3000 in use” — but you would be excused for not knowing that. It’s not a very good error message.
Looking at the entire error message again, with the different parts annotated, it looks like this:
Anatomy of a Python Error Message
Let’s try to look at the same situation in Python, to see how stack-traces vary from language to language. This is mostly the same program as before with the same files. The only difference is, that it uses the Python framework called bottle
instead of express
to listen to port 3000.
Just as before, if we run multiple instances of the program, we get an error:
There’s a few notable differences to this stack-trace (which Python prefers to call a trace-back.)
The most obvious one is, that it’s in a different order.
In the Javascript example, the oldest calls were at the bottom, but as this python example helpfully points out, here the most recent calls are at the bottom instead.
There’s also no startup-noise, the stack-trace starts right at the line of our code where the error happens.
Apart from that, the rest of the parts are the same, let’s take a closer look.
There’s “our code” — both first and last line. The first line is also the first line of the stack trace:
File "index.py", line 5, in <module>
some_random_function_that_starts_a_server()
and there’s the last line of our code:
File "/home/geewee/PycharmProjects/myproject/server.py", line 12, in start_server
run(host='localhost', port=3000)
Then there’s the first line of the third-party code:
File "/home/geewee/PycharmProjects/myproject/venv/lib64/python3.7/site-packages/bottle.py", line 3127, in run
server.run(app)
Worth noting here is that /site-packages/
is where python stores third-party libraries. So based on that directory we know the next call is to a third party library. Reading the directory name, bottle/
— we can guess that the error is coming from the bottle
library.
Then there’s internal third party calls in the bottle library, and at the end, the actual error message:
"OSError: [Errno 98] Address already in use"
A little better than the one from express, but still not as good as it could have been.
If we annotate the stack-trace with the different parts, it looks like this:
Fifty Shades of Stack Traces
Now, the two stack traces we’ve seen here are reasonably identical — there’s potentially some startup noise, some of our code and an error thrown in a third party library. Now not all error conditions are like that, so not all stack traces are like that either.
Third Parties Not Allowed
Sometimes there’s no third-party calls, as this Java example shows us:
This program tries to figure out the length of a java String
which has been assigned to null
. Running this program gives us a very minimal stack-trace:
Exception in thread "main" java.lang.NullPointerException
at Main.randomFunction(Main.java:9)
at Main.main(Main.java:4)
Note there’s no startup-noise, no third party code. There’s only our code, ending at the exact line where we’ve made our mistake. If there’s no third-party code, the “last line of our code” is the place to check out to see what’s gone wrong.
Dude Where’s My Code?
Now let’s look at an example using a large framework called Spring Boot. Spring works with both Java and Kotlin. This example is in Kotlin. Now we’ll cause an error without ever really having our code appear in the stack trace. We can do this by defining a very small application with two classes that both want to listen to the same /hello
HTTP endpoint. Spring can’t decide which class should handle the /hello
endpoint, and thus crashes at startup time.
The stack-trace we’ll get is this behemoth:
We’re not going to dissect this intensely, as it’s very large. Our main method is somewhere in it, but that method doesn’t really do much. The stack-trace is instead dominated primarily by internal third party calls from the Spring Framework. If we strip the internal third party calls and remove the last part, as that’s simply an inner Spring exception, and not that important — we get something more comprehensible.
Here it’s easier to find the actual error message, which is luckily reasonably informative:
Ambiguous mapping. Cannot map 'restController' method
public java.lang.String dk.gustavwengel.myproject.RestController.helloWorld()
to {[/hello]}: There is already 'identicalRestController' bean method
If you’re using a large framework it happens quite a bit that there’s no code of yours in the stack trace at all. This usually means it’s a configuration issue, but these errors can be extremely hard to debug. Often we rely on helpful images from the framework authors to get us through these kind of errors, as the stack-trace is close to useless.
Summary
We’ve seen how we can take an error message and divide it into different parts. We’ve discussed what parts are important, and what parts can usually be ignored. In the next part we’ll talk about how to select the right terms when searching, and how googling error messages is actually a process where you learn as you go, not just one where you find answers.
Are you excited for the next part? Did you have any thoughts on this one, or do you just want to gush about how that Elm error message was really great? Reach out to me on twitter at @GeeWengel
Did you enjoy this post? Please share it!
This chapter provides an overview of the error model for Google APIs. It also
provides general guidance to developers on how to properly generate and
handle errors.
Google APIs use a simple protocol-agnostic error model, which allows us to
offer a consistent experience across different APIs, different API protocols
(such as gRPC or HTTP), and different error contexts (such as asynchronous,
batch, or workflow errors).
Error Model
The error model for Google APIs is logically defined by
google.rpc.Status
,
an instance of which is returned to the client when an API error occurs. The
following code snippet shows the overall design of the error model:
package google.rpc;
// The `Status` type defines a logical error model that is suitable for
// different programming environments, including REST APIs and RPC APIs.
message Status {
// A simple error code that can be easily handled by the client. The
// actual error code is defined by `google.rpc.Code`.
int32 code = 1;
// A developer-facing human-readable error message in English. It should
// both explain the error and offer an actionable resolution to it.
string message = 2;
// Additional error information that the client code can use to handle
// the error, such as retry info or a help link.
repeated google.protobuf.Any details = 3;
}
Because most Google APIs use resource-oriented API design, the error handling
follows the same design principle by using a small set of standard errors with a
large number of resources. For example, instead of defining different kinds of
«not found» errors, the server uses one standard google.rpc.Code.NOT_FOUND
error code and tells the client which specific resource was not found. The
smaller error space reduces the complexity of documentation, affords better
idiomatic mappings in client libraries, and reduces client logic complexity
while not restricting the inclusion of actionable information.
Error Codes
Google APIs must use the canonical error codes defined by
google.rpc.Code
.
Individual APIs must avoid defining additional error codes, since
developers are very unlikely to write logic to handle a large number of error
codes. For reference, handling an average of three error codes per API call
would mean most application logic would just be for error handling, which would
not be a good developer experience.
Error Messages
The error message should help users understand and resolve the API error
easily and quickly. In general, consider the following guidelines when writing
error messages:
- Do not assume the user is an expert user of your API. Users could be client
developers, operations people, IT staff, or end-users of apps. - Do not assume the user knows anything about your service implementation or
is familiar with the context of the errors (such as log analysis). - When possible, error messages should be constructed such that a technical
user (but not necessarily a developer of your API) can respond to the error
and correct it. - Keep the error message brief. If needed, provide a link where a confused
reader can ask questions, give feedback, or get more information that
doesn’t cleanly fit in an error message. Otherwise, use the details field to
expand.
Error Details
Google APIs define a set of standard error payloads for error details, which you
can find in
google/rpc/error_details.proto.
These cover the most common needs for API errors, such as quota failure and
invalid parameters. Like error codes, developers should use these standard
payloads whenever possible.
Additional error detail types should only be introduced if they can assist
application code to handle the errors. If the error information can only be
handled by humans, rely on the error message content and let developers handle
it manually rather than introducing additional error detail types.
Here are some example error_details
payloads:
ErrorInfo
: Provides structured error information that is both stable
and extensible.RetryInfo
: Describes when clients can retry a failed request, may be
returned onCode.UNAVAILABLE
orCode.ABORTED
QuotaFailure
: Describes how a quota check failed, may be returned on
Code.RESOURCE_EXHAUSTED
BadRequest
: Describes violations in a client request, may be returned on
Code.INVALID_ARGUMENT
Error Info
ErrorInfo
is a special kind of error payload. It provides stable and
extensible error information that both humans and applications can depend on.
Each ErrorInfo
has three pieces of information: an error domain, an error
reason, and a set of error metadata, such as this
example.
For more information, see the
ErrorInfo
definition.
For Google APIs, the primary error domain is googleapis.com
, and the
corresponding error reasons are defined by google.api.ErrorReason
enum.
For more information, see the
google.api.ErrorReason
definition.
Error Localization
The message
field in
google.rpc.Status
is developer-facing and must be in English.
If a user-facing error message is needed, use
google.rpc.LocalizedMessage
as your details field. While the message field in
google.rpc.LocalizedMessage
can be localized, ensure that the message field in
google.rpc.Status
is in English.
By default, the API service should use the authenticated user’s locale or HTTP
Accept-Language
header or the language_code
parameter in the request to
determine the language for the localization.
Error Mapping
Google APIs are accessible in different programming environments. Each
environment typically has its own way of error handling. The following
sections explain how the error model is mapped in commonly used environments.
HTTP Mapping
While proto3 messages have native JSON encoding, Google’s API Platform uses a
different error schema for Google’s JSON HTTP APIs for backward compatibility
reasons.
Schema:
// This message defines the error schema for Google's JSON HTTP APIs.
message Error {
// Deprecated. This message is only used by error format v1.
message ErrorProto {}
// This message has the same semantics as `google.rpc.Status`. It uses HTTP
// status code instead of gRPC status code. It has extra fields `status` and
// `errors` for backward compatibility with [Google API Client
// Libraries](https://developers.google.com/api-client-library).
message Status {
// The HTTP status code that corresponds to `google.rpc.Status.code`.
int32 code = 1;
// This corresponds to `google.rpc.Status.message`.
string message = 2;
// Deprecated. This field is only used by error format v1.
repeated ErrorProto errors = 3;
// This is the enum version for `google.rpc.Status.code`.
google.rpc.Code status = 4;
// This corresponds to `google.rpc.Status.details`.
repeated google.protobuf.Any details = 5;
}
// The actual error payload. The nested message structure is for backward
// compatibility with [Google API Client
// Libraries](https://developers.google.com/api-client-library). It also
// makes the error more readable to developers.
Status error = 1;
}
Example (link):
{
"error": {
"code": 400,
"message": "API key not valid. Please pass a valid API key.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "API_KEY_INVALID",
"domain": "googleapis.com",
"metadata": {
"service": "translate.googleapis.com"
}
}
]
}
}
gRPC Mapping
Different RPC protocols map the error model differently. For
gRPC, the error model is natively supported by the generated
code and the runtime library in each supported language. You can find out more
in gRPC’s API documentation. For example, see gRPC Java’s
io.grpc.Status
.
Client Library Mapping
Google client libraries may choose to surface errors differently per language to
be consistent with established idioms. For example, the
google-cloud-go
library will return an error that implements the same interface as
google.rpc.Status
,
while
google-cloud-java
will raise an Exception.
Handling Errors
Below is a table containing all of the gRPC error codes defined in
google.rpc.Code
and a short description of their cause. To handle an error, you can check the
description for the returned status code and modify your call accordingly.
HTTP | gRPC | Description |
---|---|---|
200 | OK |
No error. |
400 | INVALID_ARGUMENT |
Client specified an invalid argument. Check error message and error details for more information. |
400 | FAILED_PRECONDITION |
Request can not be executed in the current system state, such as deleting a non-empty directory. |
400 | OUT_OF_RANGE |
Client specified an invalid range. |
401 | UNAUTHENTICATED |
Request not authenticated due to missing, invalid, or expired OAuth token. |
403 | PERMISSION_DENIED |
Client does not have sufficient permission. This can happen because the OAuth token does not have the right scopes, the client doesn’t have permission, or the API has not been enabled. |
404 | NOT_FOUND |
A specified resource is not found. |
409 | ABORTED |
Concurrency conflict, such as read-modify-write conflict. |
409 | ALREADY_EXISTS |
The resource that a client tried to create already exists. |
429 | RESOURCE_EXHAUSTED |
Either out of resource quota or reaching rate limiting. The client should look for google.rpc.QuotaFailure error detail for more information. |
499 | CANCELLED |
Request cancelled by the client. |
500 | DATA_LOSS |
Unrecoverable data loss or data corruption. The client should report the error to the user. |
500 | UNKNOWN |
Unknown server error. Typically a server bug. |
500 | INTERNAL |
Internal server error. Typically a server bug. |
501 | NOT_IMPLEMENTED |
API method not implemented by the server. |
502 | N/A | Network error occurred before reaching the server. Typically a network outage or misconfiguration. |
503 | UNAVAILABLE |
Service unavailable. Typically the server is down. |
504 | DEADLINE_EXCEEDED |
Request deadline exceeded. This will happen only if the caller sets a deadline that is shorter than the method’s default deadline (i.e. requested deadline is not enough for the server to process the request) and the request did not finish within the deadline. |
Retrying Errors
Clients may retry on 503 UNAVAILABLE errors with exponential backoff.
The minimum delay should be 1s unless it is documented otherwise. The default
retry repetition should be once unless it is documented otherwise.
For 429 RESOURCE_EXHAUSTED errors, the client may retry at the higher level
with minimum 30s delay. Such retries are only useful for long running
background jobs.
For all other errors, retry may not be applicable. First ensure your request
is idempotent, and see
google.rpc.RetryInfo
for guidance.
Propagating Errors
If your API service depends on other services, you should not blindly propagate
errors from those services to your clients. When translating errors, we suggest
the following:
- Hide implementation details and confidential information.
- Adjust the party responsible for the error. For example, a server that
receives anINVALID_ARGUMENT
error from another service should propagate
anINTERNAL
to its own caller.
Reproducing Errors
If you cannot resolve errors through analysis of logs and monitoring, you should
try to reproduce the errors with a simple and repeatable test. You can use the
test to collect more information for troubleshooting, which you can provide
when contacting technical support.
We recommend you use curl -v
and
System Parameters to reproduce errors with
Google APIs. Together they can reproduce almost all Google API requests,
and provide you verbose debug information. For more information, see the
respective documentation pages for the API you are calling.
Generating Errors
If you are a server developer, you should generate errors with enough
information to help client developers understand and resolve the problem. At the
same time, you must be aware of the security and privacy of the user data, and
avoid disclosing sensitive information in the error message and error details,
since errors are often logged and may be accessible by others. For example, an
error message like «Client IP address is not on allowlist 128.0.0.0/8» exposes
information about the server-side policy, which may not be accessible to the
user who has access to the logs.
To generate proper errors, you first need to be familiar with google.rpc.Code
to
choose the most suitable error code for each error condition. A server
application may check multiple error conditions in parallel, and return the
first one.
The following table lists each error code and an example of a good error
message.
HTTP | gRPC | Example Error Message |
---|---|---|
400 | INVALID_ARGUMENT |
Request field x.y.z is xxx, expected one of [yyy, zzz]. |
400 | FAILED_PRECONDITION |
Resource xxx is a non-empty directory, so it cannot be deleted. |
400 | OUT_OF_RANGE |
Parameter ‘age’ is out of range [0, 125]. |
401 | UNAUTHENTICATED |
Invalid authentication credentials. |
403 | PERMISSION_DENIED |
Permission ‘xxx’ denied on resource ‘yyy’. |
404 | NOT_FOUND |
Resource ‘xxx’ not found. |
409 | ABORTED |
Couldn’t acquire lock on resource ‘xxx’. |
409 | ALREADY_EXISTS |
Resource ‘xxx’ already exists. |
429 | RESOURCE_EXHAUSTED |
Quota limit ‘xxx’ exceeded. |
499 | CANCELLED |
Request cancelled by the client. |
500 | DATA_LOSS |
See note. |
500 | UNKNOWN |
See note. |
500 | INTERNAL |
See note. |
501 | NOT_IMPLEMENTED |
Method ‘xxx’ not implemented. |
503 | UNAVAILABLE |
See note. |
504 | DEADLINE_EXCEEDED |
See note. |
Error Payloads
The google.rpc
package defines a set of standard error payloads, which are
preferred to custom error payloads. The following table lists each error code
and its matching standard error payload, if applicable. We recommend advanced
applications look for these error payloads in google.rpc.Status
when they
handle errors.
HTTP | gRPC | Recommended Error Detail |
---|---|---|
400 | INVALID_ARGUMENT |
google.rpc.BadRequest |
400 | FAILED_PRECONDITION |
google.rpc.PreconditionFailure |
400 | OUT_OF_RANGE |
google.rpc.BadRequest |
401 | UNAUTHENTICATED |
google.rpc.ErrorInfo |
403 | PERMISSION_DENIED |
google.rpc.ErrorInfo |
404 | NOT_FOUND |
google.rpc.ResourceInfo |
409 | ABORTED |
google.rpc.ErrorInfo |
409 | ALREADY_EXISTS |
google.rpc.ResourceInfo |
429 | RESOURCE_EXHAUSTED |
google.rpc.QuotaFailure |
499 | CANCELLED |
|
500 | DATA_LOSS |
google.rpc.DebugInfo |
500 | UNKNOWN |
google.rpc.DebugInfo |
500 | INTERNAL |
google.rpc.DebugInfo |
501 | NOT_IMPLEMENTED |
|
503 | UNAVAILABLE |
google.rpc.DebugInfo |
504 | DEADLINE_EXCEEDED |
google.rpc.DebugInfo |
10 More Discussions You Might Find Interesting
1. SuSE
Some error messages in var/log/messages
How are you?
SUSE V10 and 11.
In /var/log/messages I see these lines in some servers. I’d like to know what causes these errors and how to fix them.
Thank you,
error: PAM: Authentication failure for root from XXXXXXXX
Did not receive identification string from XXXXXXX
Invalid user suse-gm… (2 Replies)
Discussion started by: JDBA
2. AIX
Error messages in syslog
Hi,
Can you please look into the below errors from syslog in AIX?
And let me know is this a issue? How can I avoid these errors with out affecting my LPAR.
Detail Data
SYSLOG MESSAGE
<27>Aug 23 08:24:28 syslog: slp: 0660-084 The SA failed to decode and compute received message:… (0 Replies)
Discussion started by: System Admin 77
3. Shell Programming and Scripting
Appending error messages from log file next to the corresponding error record
Hi Everyone,
I have an issue and trying to get a solution but was not succesful yet. Any help is greatly appreciated.
I am using ksh to inoke sql loader to load data from txt file into two oracle tables based on the condition written in the control file. If an error occurs while loading into… (8 Replies)
Discussion started by: vpv0002
4. UNIX for Dummies Questions & Answers
WHat do these error messages mean
New to UNIX.
I saw these messages in my logs.
What do they mean? What is a forward and reverse map?
Unable to add forward map from Rogers.ga.com to 205.150.86.252: timed out
unable to add reverse map from 241.86.150.205.in-addr.arpa. to FFXXB2RNHR71.NA.XOM.COM: timed out (2 Replies)
Discussion started by: mojoman
5. Shell Programming and Scripting
ftp error messages!
Please see the below script-
ftp $FTPREMOTESERVER
prompt
mput $DATAPATH/*.dat
quit | ftp -in > FTPRETURNMSGLOGFILE # iam trying write the eroor messages inside a file when the ftp quits.
Based on the above script te ftp is properly working but writing into the file wen ftp quits is nor… (1 Reply)
Discussion started by: dineshr85
6. Solaris
error messages
dear all
i have the following error in messages in solaris server named devweb
does any one can help me about the error
the disk devapp connect by nfs to another server called devdb :
Oct 10 09:55:41 devweb nfs: WARNING: NFSMAPID_DOMAIN does not match the server: devdb domain.
Oct 10… (0 Replies)
Discussion started by: murad.jaber
7. UNIX for Advanced & Expert Users
error messages in /var/adm/messages
Hi,
I have a SunFire V490, Solaris 10 with XP1024 storage and HP Library. I have noticed the following error messages in the /var/adm/messages file. These errors are being generated constantly. Also commands like devfsadm, format cfgadm etc are getting hung. After a reboot it works fine for a… (1 Reply)
Discussion started by: nitinp82
8. UNIX for Dummies Questions & Answers
Error Messages
I have got script like this
#!/bin/ksh -e
function errtrap {
es=$?
print «ERROR line $1: Command exited with status $es.» … (1 Reply)
Discussion started by: akrathi
9. UNIX for Advanced & Expert Users
System Error messages
Hi Experts,
I’m getting the following errors on /var/adm/messages file permanently.
Dec 28 10:19:38 ioocsrv1 bsd-gw: open(dfA415ioocsrv3): File exists
Dec 28 10:20:53 ioocsrv1 bsd-gw: open(dfA415ioocsrv3): File exists
Dec 28 10:22:08 ioocsrv1 bsd-gw: open(dfA415ioocsrv3): File exists
Dec… (1 Reply)
Discussion started by: nikk
10. UNIX for Dummies Questions & Answers
error messages
Dear Guys ,
AM using linux R.H 6.1 , I configured sendmail , when i update the alias file , i keep getting the following message :
» Warning: .cf file is out of date: sendmail 8.11.6 supports version 9, .cf file is version 8 »
so what does it mean , even though .cf file is not empty or… (1 Reply)
Discussion started by: tamemi
So you’re a newbie trying out a new technology, minding your own business when all of a sudden:
Uncaught (in promise) TypeError: _super.call is not a function
at new ObservableQuery (b1f6a7d9f98d979758232d0dc3c394ce.js:26213)
at QueryManager.watchQuery (b1f6a7d9f98d979758232d0dc3c394ce.js:27305)
at b1f6a7d9f98d979758232d0dc3c394ce.js:27332
at new Promise (<anonymous>)
at QueryManager.query (b1f6a7d9f98d979758232d0dc3c394ce.js:27330)
at ApolloClient.query (b1f6a7d9f98d979758232d0dc3c394ce.js:27981)
at Object.require.2.react (b1f6a7d9f98d979758232d0dc3c394ce.js:29740)
at newRequire (b1f6a7d9f98d979758232d0dc3c394ce.js:41)
at require.39 (b1f6a7d9f98d979758232d0dc3c394ce.js:66)
at b1f6a7d9f98d979758232d0dc3c394ce.js:71
Enter fullscreen mode
Exit fullscreen mode
You copy and paste the whole thing into Google, and a mere second later:
Your search - Uncaught (in promise) TypeError: _super.call is not a function - did not match any documents.
Suggestions:
Make sure that all words are spelled correctly.
Try different keywords.
Try more general keywords.
Try fewer keywords.
Enter fullscreen mode
Exit fullscreen mode
Or perhaps worse, you get tons of results, but none of them lead anywhere useful!
What now?
This was the question posed today by Brittany Storoz. As a recent Javascript newbie myself I am pretty familiar with this. Javascript is not a typesafe language so it is particularly prone to cryptic errors. Over the past year I have done my fair share of Googling The Error with various degrees of success, so I am going to lay down some thoughts here (as well as combining the thoughts of others). Here goes!
1. Don’t Panic
Don’t Panic! 😂 Googling Errors is a rite of passage. In fact, treat it as a welcome opportunity to practice researching errors because this is a key skill in your career. The process will likely turn up other bits of knowledge you didn’t know you were missing!
Now that you’re calm: READ THE ERROR. Quote Mark Erikson:
Slight bit of venting:
Error messages _usually_ have relevant info. You may not understand every word, but they often tell you what the problem is and how to fix it. Even if there’s no google hits for the message, you may already have all the info you need to solve it.
03:42 AM — 02 Jan 2018
Believe it or not, someone somewhere put effort into writing that error you’re reading. Does it make sense or are you just glazing over it in blind panic?
2. Rubber Duck It
Rubber Duck Debugging is a time-tested method of software engineering. Basically, try to explain to an inanimate object (preferably cute, squeakiness optional) in your own words what you are trying to do, and what the error is. Your natural language description of the problem is likely how others are also going to describe it, so plug that into Google and see what happens. You might be surprised! 🦆
3. Go in Expanding Circles (remove irrelevant info)
Your error likely has a lot of App-specific info in it. For example:
$ node_modules/.bin/parcel watch app/client/entry.html --out-dir public/dist
🚨 Cannot read property 'type' of undefined
at Bundler.createBundleTree (/home/ben/projects/dg/node_modules/parcel-bundler/src/Bundler.js:373:52)
at Bundler.createBundleTree (/home/ben/projects/dg/node_modules/parcel-bundler/src/Bundler.js:412:12)
at Bundler.createBundleTree (/home/ben/projects/dg/node_modules/parcel-bundler/src/Bundler.js:412:12)
at Bundler.buildQueuedAssets (/home/ben/projects/dg/node_modules/parcel-bundler/src/Bundler.js:245:23)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
Enter fullscreen mode
Exit fullscreen mode
Plugging all that into Google isn’t going to help! Why? Because you’ve left a bunch of assumptions in there that only you are going to use, for example app/client/entry.html
and /home/ben/projects/dg
. So removing them and decreasing the specificity of your search is likely to improve the search results to find other people who had similar issues to you.
James Roe phrased this better than I can:
@brittanystoroz error code -> error message -> language -> library -> syntax would be my general guide, in descendi… twitter.com/i/web/status/9…
00:02 AM — 04 Jan 2018
So if you have an error code, Google that. If that doesn’t work, Google the error message. If that doesn’t work, Google the library you’re using. and so on!
4. Give more Context (add relevant keywords)
Errors are also notable for what they leave out. In this case, there is an implicit assumption that you, the developer, know what language or library you are using. But there’s no way for Google to know that! Help Google along by adding the tech stack you are using as keywords, for example, parceljs Cannot read property 'type' of undefined
. Remember your end goal is to hopefully land on a Github Issue, Stackoverflow question, or blog post so give Google all the context you can to help it surface the answer you need!
Incidentally, version numbers are a big part of context too. If you are experiencing an error on D3.js v4, then answers from D3.js v3 won’t be very helpful! If you don’t have version numbers or think your error is more generic, throwing a date limit on your query (Google lets you restrict it to the past 1 year) is likely to turn up more recent results which are likely to be more relevant.
5. Use advanced search operators
Google’s searchbox packs a lot of power if you know how to wield it. Check out this cheatsheet (or others like this) for advanced search tips to search only for quoted content, or for all search words, so on and so forth. (Thanks Guinivere Saenger). Special bonus, this increases your Google-fu for your non-dev life too!
6. Don’t Google!
Google isn’t the only search engine out there. There are plenty of venues where people go for help — like Stackoverflow and Github — and they have plenty fine search functionality too!
Google is also not the most dev-friendly search engine. Quote Quincy Larson:
«Another thing a lot of new programmers don’t realize is that Google omits most non-alphanumeric characters from its queries. Symbols that programmers use all the time like !@#$%^& and * aren’t searched. Neither are (){}[].»
So if you have a lot of symbols in your search, use DuckDuckGo!
7. Think about your biggest unknown
Programming works in terms of layers of abstraction. At the biggest of the big picture level there is the OSI model, but if you are an app developer then your layers can be something like:
- Language
- Environment
- Framework
- Library
- App
What do I mean by biggest unknown? Well, if you are new to a language, then when you have errors you are most likely making a simple syntactical error because you are not yet familiar with all the grammar and edge cases a new language can bring.
Confident it’s not a language problem? Then proceed to the environment. Languages are evolving specifications and the environment in which you are coding matters a LOT as to how you can actually use the language. As a Javascript developer I always see people getting tripped up by whether they can or cannot use ES6 syntax. So they get errors that they then Google and get totally confused by.
You’ve ruled out environment as the cause? Proceed to framework. So on and so forth. You can even proceed in reverse order if that suits you. Whatever works.
This step isn’t meant to take long, I just erred verbose to emphasize what I mean by «Think about your biggest unknown». Your biggest unknown is your biggest source of risk, and therefore the first (but not only!) place to look when you have errors.
8. Read the Docs
If your error has to do with a specific Framework or Library, it is quite possible that there is some concept or language you may not know about that is the hidden cause of your error. Go read the docs, and look at the examples and understand how you might differ from that. Pay attention to the docs’ specific choice of words and add that as keywords to your Google search to see if it surfaces any better results.
9. Reproduce the Error
Start a whole new project and make it very small so that you can isolate your Error. Copy over the bare minimum from your existing project that you will reproduce the Error, or just try to code it up from scratch without all the extra fluff your main project has.
If you cannot reproduce the Error, you will have found a HUGE clue as to what is going on with your error.
If you CAN reproduce the Error, that’s also great, because that sets you up for…
10. Asking for Help
Post your error EVERYWHERE. Github, Stackoverflow, Reddit, Twitter, Slack/Discord communities, Dev.to (ahem!), you name it.
Your minimally reproducible sample, if you have it from step 9, will help go a long way for people to figure out what is going on.
Furthermore, it will help FUTURE people who have YOUR exact error be able to Google to find YOU. If we are ever going to have Googlable error solutions, someone has to start the ball rolling!
More Resources
- Michael Hoffman’s presentation on How To Be Stuck
- Qunicy Larson’s answer on How do I master the art of Googling as a programmer?
Good luck!
Ниже перечислены сообщения об ошибках и коды ошибок, которые вы можете встретить при работе с Gmail и Google Workspace. Эти сообщения и коды помогают найти и устранить проблему с электронной почтой.
Чтобы обозначить источник ошибки, Gmail добавляет в конец сообщения один или оба из следующих фрагментов:
- gsmtp (Google SMTP): добавляется во все сообщения об ошибках;
- gcdp (Google Custom Domain Policies): добавляется в сообщения об ошибках, связанных с правилами, которые созданы администратором.
Например, сообщение 550 5.7.1 This message violates example.com email policy. – gcdp <sessionid> – gsmtp (Это сообщение нарушает политику example.com в отношении электронной почты. – gcdp <sessionid> – gsmtp) указывает, что ошибка связана с персонализированным правилом, созданным администратором.
Подробнее о сообщениях об ошибках SMTP…
Примечание. Ошибка 2014 связана с расширением браузера Chrome. По очереди отключите расширения Chrome, чтобы определить, какое из них вызывает ошибку. Сообщение об ошибке 2014: В системе произошла ошибка (2014). Повторите попытку.
Сообщения об ошибках протокола SMTP
421, «4.3.0». Временные неполадки в системе. Повторите попытку позже |
421, «4.4.5», Server busy, try again later. (Сервер занят. Повторите попытку позже.) |
421, «4.7.0», IP not in whitelist for RCPT domain, closing connection. (Соединение прервано, так как IP-адрес отсутствует в белом списке домена RCPT.) |
421, «4.7.0», Our system has detected an unusual rate of unsolicited mail originating from your IP address. To protect our users from spam, mail sent from your IP address has been temporarily blocked. For more information, visit Prevent mail to Gmail users from being blocked or sent to spam. (С вашего IP-адреса с необычной частотой поступают незапрашиваемые сообщения. Почта, отправляемая с вашего IP-адреса, временно заблокирована для защиты пользователей от спама. Дополнительная информация приведена в статье Как предотвратить блокировку почты, предназначенной пользователям Gmail, или ее отправку в папку «Спам».) |
421, «4.7.0», Temporary System Problem. Try again later. (Временные неполадки в системе. Повторите попытку позже.) |
421, «4.7.0», TLS required for RCPT domain, closing connection. (Соединение прервано, так как для домена RCPT требуется протокол TLS.) |
421, «4.7.0», Try again later, closing connection. This usually indicates a Denial of Service (DoS) for the SMTP relay at the HELO stage. (Соединение прервано. Повторите попытку позже. Эта ошибка обычно указывает на атаку типа «отказ в обслуживании» (DoS) для ретрансляции SMTP на этапе HELO.) |
450, «4.2.1», The user you are trying to contact is receiving mail too quickly. Please resend your message at a later time. If the user is able to receive mail at that time, your message will be delivered. For more information, visit Limits for sending & getting mail. (Пользователь, которому вы пытаетесь отправить письмо, получает почту слишком часто. Отправьте сообщение позже. Если к тому времени пользователь сможет получать почту, ваше письмо будет доставлено. Дополнительная информация приведена в статье Ограничения на отправку и получение писем.) |
450, «4.2.1», The user you are trying to contact is receiving mail at a rate that prevents additional messages from being delivered. Please resend your message at a later time. If the user is able to receive mail at that time, your message will be delivered. For more information, visit Limits for sending & getting mail. (Пользователь, которому вы пытаетесь отправить письмо, получает почту со скоростью, которая не позволяет доставлять ему дополнительные сообщения. Отправьте сообщение позже. Если к тому времени пользователь сможет получать почту, ваше письмо будет доставлено. Дополнительная информация приведена в статье Ограничения на отправку и получение писем.) |
450, «4.2.1», Peak SMTP relay limit exceeded for customer. This is a temporary error. For more information on SMTP relay limits, please contact your administrator or visit SMTP relay service error messages. (Превышено пиковое ограничение на ретрансляцию для клиента. Это временная ошибка. Чтобы получить подробную информацию об ограничениях, ознакомьтесь с этой статьей или свяжитесь с администратором.) |
451, «4.3.0», Mail server temporarily rejected message. (Почтовый сервер временно отклонил сообщение.) |
451, «4.3.0», Multiple destination domains per transaction is unsupported. Please try again. (Использование нескольких целевых доменов для одной операции не поддерживается. Повторите попытку.) |
451, «4.4.2», Timeout — closing connection. (Время ожидания истекло – соединение прервано.) |
451, «4.5.0», SMTP protocol violation, visit RFC 2821. (Нарушение протокола SMTP, см. RFC 2821.) |
452, «4.2.2», The email account that you tried to reach is over quota. Please direct the recipient to Clear Google Drive space & increase storage. (В аккаунте получателя закончилось свободное место. Предложите получателю ознакомиться с этой статьей.) |
452, «4.5.3», Domain policy size per transaction exceeded, please try this recipient in a separate transaction. |
452, «4.5.3», Your message has too many recipients. For more information regarding Google’s sending limits, visit Limits for sending & getting mail. (У вашего сообщения слишком много получателей. Дополнительная информация приведена в статье Ограничения на отправку и получение писем.) |
454, «4.5.0», SMTP protocol violation, no commands allowed to pipeline after STARTTLS, visit RFC 3207. (Нарушение протокола SMTP, после STARTTLS для потока запрещены другие команды, см. RFC 3207.) |
454, «4.7.0», Cannot authenticate due to temporary system problem. Try again later. (Не удалось выполнить аутентификацию из-за временных неполадок в системе. Повторите попытку позже.) |
454, «5.5.1», STARTTLS may not be repeated. (Запрещено повторять команду STARTTLS.) |
501, «5.5.2», Cannot Decode response. (Не удалось расшифровать ответ.) |
501, «5.5.4», HELO/EHLO argument is invalid. For more information, visit HELO/EHLO email error. (Недопустимый аргумент HELO/EHLO. Дополнительная информация приведена в статье Ошибка HELO/EHLO.) |
502, «5.5.1», Too many unrecognized commands, goodbye. (Слишком много нераспознанных команд.) |
502, «5.5.1», Unimplemented command. (Незадействованная команда.) |
502, «5.5.1», Unrecognized command. (Нераспознанная команда.) |
503, «5.5.1», EHLO/HELO first. (Сначала команда EHLO/HELO.) |
503, «5.5.1», MAIL first. (Сначала команда MAIL.) |
503, «5.5.1», RCPT first. (Сначала команда RCPT.) |
503, «5.7.0», No identity changes permitted. (Запрещены изменения идентификационных данных.) |
504, «5.7.4», Unrecognized Authentication Type. (Нераспознанный тип аутентификации.) |
530, «5.5.1», Authentication Required. For more information, visit Can’t sign in to your Google Account. (Необходима аутентификация. Дополнительная информация приведена в статье Не удается войти в аккаунт Google.) |
530, «5.7.0», Must issue a STARTTLS command first. (Сначала необходима команда STARTTLS.) |
535, «5.5.4», Optional Argument not permitted for that AUTH mode. (Для этого режима AUTH запрещен необязательный аргумент.) |
535, «5.7.1», Application-specific password required. For more information, visit Sign in using App Passwords. (Требуется пароль приложения. Дополнительная информация приведена в статье Как войти в аккаунт с помощью паролей приложений.) |
535, «5.7.1», Please log in with your web browser and then try again. For more information, visit Check Gmail through other email platforms. (Войдите через браузер и повторите попытку. Дополнительная информация приведена в статье Как настроить доступ к Gmail в сторонних почтовых клиентах.) |
535, «5.7.1», Username and Password not accepted. For more information, visit Can’t sign in to your Google Account. (Имя пользователя и пароль не приняты. Дополнительная информация приведена в статье Не удается войти в аккаунт Google.) |
550, «5.1.1», The email account that you tried to reach does not exist. Please try double-checking the recipient’s email address for typos or unnecessary spaces. For more information, visit Fix bounced or rejected emails. (Аккаунт электронной почты получателя не существует. Проверьте ещё раз, правильно ли указан адрес электронной почты и нет ли в нем пробелов. Дополнительная информация приведена в статье Что делать, если письмо отклонено.) |
550, «5.2.1», The email account that you tried to reach is disabled. (Аккаунт электронной почты получателя отключен.) |
550, «5.2.1», The user you are trying to contact is receiving mail at a rate that prevents additional messages from being delivered. For more information, visit Limits for sending & getting mail. (Пользователь, которому вы пытаетесь отправить письмо, получает почту со скоростью, которая не позволяет доставлять ему дополнительные сообщения. Дополнительная информация приведена в статье Ограничения на отправку и получение писем.) |
550, «5.4.5», Daily sending quota exceeded. For more information, visit Email sending limits. (Исчерпан дневной лимит на отправку сообщений. Дополнительная информация приведена в статье Ограничения в Google Workspace на отправку электронных писем из Gmail.) |
550, «5.4.5», Daily SMTP relay limit exceeded for user. For more information on SMTP relay sending limits please contact your administrator or visit SMTP relay service error messages. (Превышено суточное ограничение на ретрансляцию для клиента. Чтобы получить подробную информацию об ограничениях, ознакомьтесь с этой статьей или свяжитесь с администратором.) |
550, «5.7.0», Mail relay denied. (Почтовый ретранслятор запрещен.) |
550, «5.7.0», Mail Sending denied. This error occurs if the sender account is disabled or not registered within your Google Workspace domain. (Отправка почты запрещена. Эта ошибка возникает, если аккаунт отправителя заблокирован или не зарегистрирован в домене Google Workspace.) |
550, «5.7.1», Email quota exceeded. (Превышена квота электронной почты.) |
550, «5.7.1», Invalid credentials for relay. (Неверные учетные данные ретранслятора.) |
550, «5.7.1», Our system has detected an unusual rate of unsolicited mail originating from your IP address. To protect our users from spam, mail sent from your IP address has been blocked. Review Prevent mail to Gmail users from being blocked or sent to spam. (C вашего IP-адреса с необычной частотой поступают незапрашиваемые сообщения. Почта, отправляемая с вашего IP-адреса, заблокирована для защиты пользователей от спама. Подробную информацию читайте в статье Как предотвратить блокировку почты, предназначенной пользователям Gmail, или ее отправку в папку «Спам».) |
550, «5.7.1», Our system has detected that this message is likely unsolicited mail. To reduce the amount of spam sent to Gmail, this message has been blocked. For more information, visit Why has Gmail blocked my messages? (Это сообщение было классифицировано системой как вероятный спам и заблокировано в целях уменьшения количества спама, отправляемого в Gmail. Дополнительная информация приведена в статье Почему мои письма в Gmail заблокированы.) |
550, «5.7.1», The IP you’re using to send mail is not authorized to send email directly to our servers. Please use the SMTP relay at your service provider instead. For more information, visit ‘The IP you’re using to send email is not authorized…’. (IP-адрес, который используется для отправки почты, не имеет разрешения на отправку сообщений непосредственно на наши серверы. Используйте для отправки ретранслятор SMTP своего поставщика услуг. Дополнительная информация приведена в этой статье.) |
550, «5.7.1», The user or domain that you are sending to (or from) has a policy that prohibited the mail that you sent. Please contact your domain administrator for further details. For more information, visit Sorry, a policy is in place that prevents your message from being sent. (Для пользователя или домена, от которого или которому отправляются сообщения, установлено правило, запрещающее отправленную вами почту. Для получения дополнительной информации ознакомьтесь с этой статьей и обратитесь к своему администратору домена.) |
550, «5.7.1», Unauthenticated email is not accepted from this domain. (Почта без аутентификации от этого домена не принимается.) |
550, «5.7.1», Daily SMTP relay limit exceeded for customer. For more information on SMTP relay sending limits please contact your administrator or visit SMTP relay service error messages. (Превышено суточное ограничение на ретрансляцию для клиента. Чтобы получить подробную информацию об ограничениях, ознакомьтесь со статьей Сообщения об ошибках службы ретрансляции SMTP или свяжитесь с администратором.) |
550, «5.7.26», Unauthenticated email from domain-name is not accepted due to domain’s DMARC policy. Please contact the administrator of domain-name domain. If this was a legitimate mail please visit Control unauthenticated mail from your domain to learn about the DMARC initiative. If the messages are valid and aren’t spam, contact the administrator of the receiving mail server to determine why your outgoing messages don’t pass authentication checks. (Электронное письмо от [доменное имя] не прошло аутентификацию и запрещено правилами DMARC домена. Обратитесь к администратору домена. Если письмо запрещено по ошибке, ознакомьтесь со сведениями об инициативе DMARC в статье «Проблемы с проверкой подлинности сообщений из вашего домена» и обратитесь к администратору почтового сервера получателя, чтобы определить, почему ваши исходящие письма не проходят аутентификацию.) |
550, «5.7.26», «This message does not have authentication information or fails to pass authentication checks (SPF or DKIM). To best protect our users from spam, the message has been blocked. Please visit Prevent mail to Gmail users from being blocked or sent to spam for more information.» (Для этого письма нет информации о прохождении аутентификации (SPF или DKIM), или оно ее не прошло. Оно заблокировано, чтобы защитить наших пользователей. Более подробная информация приведена в статье «Как предотвратить блокировку почты, предназначенной пользователям Gmail, или ее отправку в папку «Спам».) |
550, «5.7.26», «This message fails to pass SPF checks for an SPF record with a hard fail policy (-all). To best protect our users from spam and phishing, the message has been blocked. Please visit Prevent mail to Gmail users from being blocked or sent to spam for more information.» (Это письмо не прошло проверки SPF для записи со строгими правилами (-all). Оно заблокировано, чтобы защитить наших пользователей от спама и фишинга. Более подробная информация приведена в статье «Как предотвратить блокировку почты, предназначенной пользователям Gmail, или ее отправку в папку «Спам».) |
552, «5.2.2», The email account that you tried to reach is over quota. (Для аккаунта электронной почты получателя превышена квота.) |
552, «5.2.3», Your message exceeded Google’s message size limits. For more information, visit Send attachments with your Gmail message. (Превышен максимально допустимый размер сообщения. Дополнительная информация приведена в статье Прикрепление файлов к письмам в Gmail.) |
553, «5.1.2», We weren’t able to find the recipient domain. Please check for any spelling errors, and make sure you didn’t enter any spaces, periods, or other punctuation after the recipient’s email address. (Не удалось найти домен получателя. Проверьте правильность адреса электронной почты получателя и убедитесь, что после него нет пробелов, точек и других знаков пунктуации.) |
554, «5.6.0», Mail message is malformed. Not accepted. (Сообщение электронной почты не принято, так как имеет недопустимый формат.) |
554, «5.6.0», Message exceeded 50 hops, this may indicate a mail loop. (Сообщение пересылалось более 50 раз, что может указывать на наличие почтового цикла.) |
554, «5.7.0», Too Many Unauthenticated commands. (Слишком много команд без аутентификации.) |
555, «5.5.2», Syntax error. (Синтаксическая ошибка.) |
Эта информация оказалась полезной?
Как можно улучшить эту статью?
На этой странице описаны сообщения об ошибках, возвращаемые Maps JavaScript API. Этот API записывает сообщения об ошибках и предупреждения в Консоль JavaScript. Некоторые ошибки могут приводить к показу затемненной карты с водяными знаками.
Ошибки, связанные с оплатой и ключом API
Как устранить
Иногда карты могут отображаться затемненными, а панорамы Просмотра улиц – в негативе, с водяными знаками с текстом «for development purposes only» (только для целей разработки). Чаще всего такая проблема связана с ключом API или оплатой. Сервисами платформы Google Карт можно пользоваться, только если в вашем аккаунте активированы платежные функции, а в запросах к API указан действительный ключ. Подробнее читайте в разделе Проверка ошибок в браузере.
Ниже приведена последовательность шагов, которая поможет вам выявить и решить проблему.
Используете ли вы ключ API?
Не знаю. Как проверить, использую ли я ключ API?
Ключ API передается как параметр key
в URL, который используется для загрузки Maps JavaScript API. Существует несколько способов проверить, используете ли вы ключ API:
- Воспользуйтесь расширением Chrome Google Maps Platform API Checker. С его помощью вы сможете определить, правильно ли реализованы лицензионные Maps API на вашем сайте.
- Если вы используете библиотеку или плагин для загрузки Maps JavaScript API проверьте настройки этой библиотеки и найдите вариант с использованием ключа API.
- Проверьте, нет ли ошибок в вашем браузере.
Если вы увидите следующие сообщения, значит вы неправильно используете ключ API: - Предупреждение Google Maps JavaScript API: NoApiKeys
- Ошибка Google Maps JavaScript API: MissingKeyMapError
Для веб-разработчиков:
-
Если у вас есть доступ к коду приложения, найдите тег
<script>
, который используется для загрузки Maps JavaScript API.
При загрузке Maps JavaScript API заменитеYOUR_API_KEY
в указанном ниже коде ключом API.<script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"> </script>
-
Проверьте в браузере сетевой трафик от вашего сайта.
В Chrome это можно сделать с помощью вкладки Network (Сеть) в инструментах разработчика.
Вы увидите сетевые запросы от вашего сайта. Запросы, сделанные с использованием Maps JavaScript API, будут указаны в путиmaps/api/js
.
Здесь вы можете убедиться, что в запросах используется параметрkey
.
Рекомендуем отфильтровать сетевой трафик на вкладке Network поmaps/api/js
.
Нет, я не использую ключ API.
Чтобы получить ключ API, нажмите кнопку ниже. Если не запустится пошаговая настройка, выполните инструкции из руководства по началу работы с платформой Google Карт.
Начать работу
Да, я использую ключ API.
Отлично! Проверьте, привязан ли к вашему проекту платежный аккаунт.
Привязан ли к вашему проекту платежный аккаунт?
Не знаю. Как проверить, привязан ли к моему проекту платежный аккаунт?
Откройте страницу оплаты в Google Cloud Console и выберите проект, в котором был создан ключ API.
Чтобы подтвердить, что этот ключ связан с проектом, сделайте следующее:
- Перейдите в раздел Credentials (Учетные данные), выбрав на левой боковой панели Google Maps Platform > Credentials (Платформа Google Карт > Учетные данные).
- Проверьте, есть ли в списке ключ API, который вы используете в настоящее время на своем сайте.
Если его здесь нет, перейдите в другой проект и проверьте учетные данные там. - Если вы не можете найти проект для этого ключа, возможно, вы потеряли доступ к этому проекту.
Попросите коллег о помощи. Если не получается найти исходный проект, можно сделать следующее:- Создайте новый проект, нажав кнопку Создать проект в списке проектов или на странице «Менеджер ресурсов».
- Создайте новый ключ API. Это можно сделать на странице Учетные данные.
После этого нажмите Создать учетные данные и выберите Ключ API.
После того как вы найдете свой проект в Cloud Console, проверьте, привязан ли к нему платежный аккаунт, в разделе Оплата в боковом меню слева.
Нет, к моему проекту не привязан платежный аккаунт.
Откройте страницу включения оплаты в Cloud Console и добавьте к проекту платежный аккаунт. Дополнительные сведения можно найти в руководстве по началу работы с платформой Google Карт.
Да, к моему проекту привязан платежный аккаунт.
Отлично! Убедитесь, что вы указали действующий способ оплаты.
Возможно, указанный способ оплаты больше не действует (например, истек срок действия кредитной карты)?
Вы можете добавить, удалить или изменить способ оплаты в Cloud Console.
Не превышен ли установленный вами дневной лимит на использование API?
Если вы установили для любого из ваших API дневной лимит, предотвращающий неожиданный перерасход, вы можете решить проблему, увеличив этот лимит.
Проверить дневные лимиты можно на панели API и сервисы в Cloud Console. Сделайте следующее:
- Если появится запрос, выберите проект.
- Выберите API из списка и откройте вкладку Квоты.
Есть ли у вашего ключа API ограничение по IP-адресам?
Ключи API с ограничением по IP-адресам можно использовать только с веб-сервисами, которые предназначены для реализации на стороне сервера (например, Geocoding API и другие API веб-сервисов).
Большинство этих веб-сервисов имеют аналоги в Maps JavaScript API (например, сервис геокодирования).
Для использования Maps JavaScript API в службах на стороне клиента нужно создать отдельный ключ API, который будет защищен ограничением по ссылающемуся домену HTTP. Подробнее…
Коды ошибок Maps JavaScript API (для разработчиков и владельцев сайтов)
В следующей таблице приведен список кодов ошибок, которые возвращает Maps JavaScript API, с описанием их причины и способом устранения.
Как посмотреть в браузере сообщения об ошибках…
Ошибки загрузки карты
В следующей таблице приведены коды ошибок Maps JavaScript API и пояснения к ним.
Код ошибки | Сообщение | Описание |
---|---|---|
|
Maps JavaScript API должен загружаться непосредственно с серверов Google. |
Элемент script, загружающий Maps JavaScript API, некорректно добавлен на страницу. Для корректной работы API должен загружаться непосредственно с сайта https://maps.googleapis.com. Как загружать Maps JavaScript API |
|
This website appears to violate the Google Maps API Terms of Service. The Google Maps API has been disabled for this website. |
Ваше приложение было заблокировано из-за несоответствия Условиям использования платформы Google Карт после отправки нескольких уведомлений по эл. почте. Чтобы обжаловать блокировку и обратиться с просьбой проверить вашу реализацию приложения, заполните эту форму. Ответ будет предоставлен по электронной почте в течение нескольких рабочих дней. Если у вас есть лицензия Premium платформы Google Карт, то, чтобы исправить ошибку, достаточно указать данные этой лицензии. Подробнее… |
|
This URL is not authorized to use the Google Maps Client ID provided. |
Идентификатор клиента с лицензией Premium или Maps APIs for Work, включенный в script, недействителен, просрочен или адрес для загрузки Maps JavaScript API не добавлен в список авторизованных URL-адресов. Как добавить URL в список авторизованных сайтов |
Коды ошибок Maps JavaScript API
Пояснения к ошибкам в Консоли JavaScript браузера Chrome, веб-консоли Firefox и других аналогичных инструментах браузера ищите в таблице ниже.
Maps JavaScript API возвращает как ошибки, так и предупреждения.
Ошибка указывает на возникновение серьезной проблемы при загрузке Maps JavaScript API. Например, ошибка – это когда API не может быть корректно загружен на страницу и не работает на ней.
Предупреждение – это дополнительная информация о загрузке Maps JavaScript API. Она описывает возможные причины ошибки или проблемы с кодом, который загружает Maps JavaScript API.
Если вы получаете только предупреждения, но не сообщения об ошибках, API на странице будет работать. Тем не менее мы рекомендуем устранять и потенциальные проблемы.
Код ошибки для разработчика | Тип | Описание |
---|---|---|
|
Ошибка |
Maps JavaScript API не активирован в вашем проекте. Чтобы активировать Maps JavaScript API для своего проекта, нажмите кнопку ниже. |
|
Ошибка |
Ключ API не авторизован для использования этой службы или API. Проверьте допустимые API для вашего ключа в Google Cloud Console, чтобы убедиться, что все API и сервисы, которые вам нужны, внесены в список. Проверьте свои ключи API в Cloud Console и ознакомьтесь со статьей Рекомендации по обеспечению безопасности доступа к API. |
|
Ошибка |
Возможно, ваш проект API удален из Cloud Console. Для этого нажмите кнопку ниже. |
|
Ошибка |
Вы не включили функции оплаты в своем проекте. Сделать это для проекта в Google Cloud, связанного с ID клиента, можно здесь. |
|
Ошибка |
Вы не включили функции оплаты в своем проекте. Подробнее… |
|
Ошибка |
Срок действия ключа API, включенного в элемент script, который загружает API, истек или не распознается системой. Создав новый ключ API, вы можете получить эту ошибку, если попытаетесь использовать ключ до того, как он будет распознан системой. Подождите несколько минут и повторите попытку, иначе может потребоваться сгенерировать новый ключ API в Cloud Console. Чтобы получить ключ API, нажмите кнопку ниже. |
|
Ошибка |
Недопустимый идентификатор клиента в элементе script, который загружает API, или истекший срок действия идентификатора. Проверьте корректность использования своего ID клиента. Идентификатор клиента должен начинаться с префикса «gme-«. Если эта ошибка возникает даже при правильном использовании ID клиента, возможно, срок действия этого идентификатора истек. Свяжитесь с вашим менеджером Google по работе с клиентами.
Если у вас нет лицензии Premium или Maps API for Work, используйте с вашим ключом API параметр Подробнее… |
|
Ошибка |
Не найден ключ API в элементе script, загружающем API. Убедитесь, что используете правильный ключ. Сгенерировать новый ключ API можно в Cloud Console. Чтобы получить ключ API, нажмите кнопку ниже. |
|
Ошибка |
Ваше приложение использует неподдерживаемую схему URI. Используйте допустимый формат URI, определенный в RFC 3986. |
|
Ошибка |
В элементе script, загружающем API, отсутствует необходимый параметр аутентификации. Если вы используете стандартный Maps JavaScript API, применяйте параметр Если у вас оформлена лицензия Premium, используйте параметр Вы не можете исправить такую ошибку, если НЕ являетесь владельцем сайта. Обнаружив ее, сообщите об этом владельцу. |
|
Ошибка |
Ваш запрос не выполнен. Более подробную информацию ищите в Cloud Console. Cloud Console |
|
Ошибка |
Ваше приложение было заблокировано из-за несоответствия Условиям использования платформы Google Карт после отправки нескольких уведомлений по эл. почте. Чтобы обжаловать блокировку и запросить проверку вашей реализации приложения, заполните эту форму. Ответ будет предоставлен вам по эл. почте в течение нескольких рабочих дней. |
|
Ошибка |
URL-адрес, загружающий Maps JavaScript API, не был добавлен в список разрешенных источников. Проверьте источники ссылок для своего ключа API в Cloud Console. Подробнее… |
|
Ошибка |
Количество запросов превысило лимиты, установленные для Maps JavaScript API. Запросы вашего приложения начнут обрабатываться снова, когда наступит время следующей дневной квоты. Вы не можете исправить такую ошибку, если НЕ являетесь владельцем сайта. Обнаружив ее, сообщите об этом владельцу. Подробнее о лимитах на использование API читайте здесь. В статье также описано, как повысить эти лимиты. |
|
Ошибка |
Предоставленный ключ API или проект API, с которым он связан, не могут быть распознаны. Возможно, эта ошибка временная. Если ошибка повторяется, не исключено, что вам потребуется получить новый ключ API или создать новый проект. Подробнее… |
|
Предупреждение |
Возможно, вы указали в параметре Подробнее об идентификаторах клиента… |
|
Предупреждение |
Возможно, вы указали в параметре Подробнее… |
|
Предупреждение |
Возможно, вы некорректно указали параметр Подробнее читайте в статье Отчеты в тарифном плане Premium. |
|
Предупреждение |
Параметр Подробнее… |
|
Предупреждение |
Ключ API в элементе script, загружающем API, выглядит некорректно. Проверьте, используете ли вы правильный ключ API. Чтобы получить ключ API, нажмите кнопку ниже. |
|
Предупреждение |
Вы указали неверный номер версии в элементе script. Подробнее читайте в статье Версии Maps JavaScript API. |
|
Предупреждение |
Возможно, вы указали ID клиента в качестве параметра key . Если у вас есть лицензия Premium или Maps API for Work, укажите идентификатор в качестве значения параметра client , а не параметра key . С лицензией Premium платформы Google Карт вы можете использовать оба параметра (client или key ). Если у вас нет лицензий, вместо параметра client необходимо использовать key .
Подробнее… |
|
Предупреждение |
Возможно, вы указали криптографический ключ или секретный код подписи в качестве параметра Подробнее… |
|
Предупреждение |
Возможно, вы указали в качестве параметра Подробнее… |
|
Предупреждение |
В элементе script, который загружает API, нет ключа API. Проверьте, указан ли действительный ключ API в качестве параметра
Чтобы получить ключ API, нажмите кнопку ниже.
Если вы попытаетесь загрузить Maps JavaScript API по ссылке на устаревшую версию (v2), то получите предупреждение |
|
Предупреждение |
Возможно, вы указали неподдерживаемую версию в элементе script. Подробнее читайте в статье Версии Maps JavaScript API. |
|
Предупреждение |
Параметр |
|
Предупреждение |
Параметр |
|
Предупреждение |
Параметр |
|
Ошибка |
Произошла ошибка, которая не относится к другим категориям, описанным на этой странице. Это может быть вызвано временной проблемой. Повторите запрос через некоторое время. Если проблема не исчезнет, сверьтесь с руководством для разработчиков, чтобы понять, имеет ли ваш запрос правильный формат. |
Проверка ошибок в браузере
Maps JavaScript API записывает сообщения об ошибках в window.console
. В этом разделе мы рассказываем, как проверить выходные данные window.console
в Google Chrome. Если вы используете другой браузер, обратитесь к его документации для разработчиков. Ниже даны ссылки на инструменты, с помощью которых можно проверить выходные данные window.console
в некоторых других браузерах:
- Консоль Internet Explorer
- Веб-консоль Firefox
- Удаленная отладка в Android
- Веб-инспектор iOS
Вот как использовать консоль JavaScript для проверки выходных данных window.console
в Chrome:
- Откройте инструменты разработчика (нажмите на значок меню > Другие инструменты > Инструменты разработчика).
-
Чтобы открыть консоль JavaScript, нажмите клавишу ESC на клавиатуре.
Клавиша ESC переключит в режим консоли JavaScript. Если вы закроете консоль, еще раз нажмите ESC, чтобы открыть ее.
Если при загрузке Maps JavaScript API возникнут ошибки или предупреждения, они сохранятся на консоли в виде строк.
Сообщение об ошибке или предупреждение имеют следующий формат:
Google Maps API error: [ERROR CODE] [Link to API document]
или
Google Maps API warning: [ERROR CODE] [Link to API document]
Чтобы понять код ошибки, найдите его в этой таблице. Кроме того, в сообщении об ошибке будет ссылка на документацию с ее описанием.
Примечание. Прослушивать ошибки аутентификации можно программно.
Работа с неподдерживаемыми браузерами
Проверьте, поддерживает ли Maps JavaScript API используемая вами версия браузера.
- Если вы пользуетесь браузером Internet Explorer (IE), обновите его до последней версии. Поскольку старые версии IE не поддерживаются, вы также можете использовать вместо них любой альтернативный поддерживаемый браузер.
- Если вы разрабатываете нативное приложение для Windows WebView в поддерживаемой версии браузера Internet Explorer, вполне вероятно, что этот браузер будет переходить в режим, в котором браузером по умолчанию станет Internet Explorer 7. Переопределить такое поведение по умолчанию можно одним из следующих способов:
- Задайте режим совместимости с помощью значения
IE X-UA-Compatible
в заголовке объекта meta (рекомендуемый способ).<meta http-equiv="x-ua-compatible" content="IE=edge">
- Обновите реестр, чтобы использовать специальные ключи для приложения (
FEATURE_BROWSER_EMULATION
).
Если ваш код по-прежнему не работает
Чтобы помочь вам справиться с наиболее распространенными ошибками, Брендан Кенни и Мано Маркс записали для вас это видео. Вот что они советуют:
- Ищите опечатки. Помните, что в языке JavaScript учитывается регистр.
- Не забывайте об основах! Некоторые распространенные проблемы возникают еще на начальном этапе создания карты. Например:
- заданы ли свойства
zoom
иcenter
; - объявлен ли элемент div, в котором карта будет отображаться на экране;
- задана ли для элемента div высота на экране. По умолчанию элементы div создаются с высотой 0 и поэтому не отображаются на экране.
Изучите примеры по программированию ссылок.
- заданы ли свойства
- В инструментах разработчика Chrome предусмотрен отладчик JavaScript, помогающий выявлять проблемы. Начните поиск ошибок с консоли JavaScript.
- Задавайте вопросы на форуме Stack Overflow. Пользуйтесь инструкциями и советами на странице Поддержка.